Python pandas:如何根据多个列对唯一值进行分组和计数?

2024-04-25 22:51:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有数据农场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()

Tags: 数据nameidnumberdfindexsamcount
3条回答

您只需将两个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函数:

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()

相关问题 更多 >