2024-04-25 22:51:27 发布
网友
我有数据农场df:
id name number 1 sam 76 2 sam 8 2 peter 8 4 jack 2
我想按“id”列分组,并根据对(name,number)计算唯一值的数目?
id count(name-number) 1 1 2 2 4 1
我试过了,但没用:
df.groupby('id')[('number','name')].nunique().reset_index()
您只需将两个groupby组合起来就可以得到所需的结果。
groupby
import pandas df = pandas.DataFrame({"id": [1, 2, 2, 4], "name": ["sam", "sam", "peter", "jack"], "number": [8, 8, 8, 2]}) group = df.groupby(['id','name','number']).size().groupby(level=0).size()
第一个groupby将计算原始组合的完整集合(从而使要计算的列唯一)。第二个groupby将计算每个所需列的唯一出现次数(并且可以使用第一个groupby将该列放入索引的事实)。
结果将是一个系列。如果希望数据帧具有正确的列名(如所需结果中所示),可以使用aggregate函数:
aggregate
group = df.groupby(['id','name','number']).size().groupby(level=0).agg({'count(name-number':'size'})
你可以:
import pandas df = pandas.DataFrame({"id": [1, 2, 3, 4], "name": ["sam", "sam", "peter", "jack"], "number": [8, 8, 8, 2]}) g = df.groupby(["name", "number"]) print g.groups
它给出:
{('jack', 2): [3], ('peter', 8): [2], ('sam', 8): [0, 1]}
要获取每个对的唯一条目数,可以执行以下操作:
for p in g.groups: print p, " has ", len(g.groups[p]), " entries"
('peter', 8) has 1 entries ('jack', 2) has 1 entries ('sam', 8) has 2 entries
更新:
操作请求数据帧中的结果。一种方法是将aggregate与length函数一起使用,它将返回一个数据帧,其中包含每个对的唯一条目数:
d = g.aggregate(len) print d.reset_index().rename(columns={"id": "num_entries"})
给出:
name number num_entries 0 jack 2 1 1 peter 8 1 2 sam 8 2
试试看
df.groupby('id').apply(lambda x: x.drop('id', axis=1).drop_duplicates().shape[0]).reset_index()
您只需将两个
groupby
组合起来就可以得到所需的结果。第一个
groupby
将计算原始组合的完整集合(从而使要计算的列唯一)。第二个groupby
将计算每个所需列的唯一出现次数(并且可以使用第一个groupby
将该列放入索引的事实)。结果将是一个系列。如果希望数据帧具有正确的列名(如所需结果中所示),可以使用
aggregate
函数:你可以:
它给出:
要获取每个对的唯一条目数,可以执行以下操作:
它给出:
更新:
操作请求数据帧中的结果。一种方法是将
aggregate
与length函数一起使用,它将返回一个数据帧,其中包含每个对的唯一条目数:给出:
试试看
相关问题 更多 >
编程相关推荐