Python pandas:如何基于多列分组和计算唯一值?

时间:2016-02-01 15:43:07

标签: python pandas group-by unique

我有datafarme df:

id name number
1 sam   76
2 sam    8
2 peter  8 
4 jack   2

我想按照' id'列和根据(名称,数字)对计算唯一值的数量?

id count(name-number)
1    1
2    2
4    1     

我试过这个,但它不起作用:

df.groupby('id')[('number','name')].nunique().reset_index()

4 个答案:

答案 0 :(得分:5)

您只需合并两个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将该列放入索引中的事实。)

结果将是一个系列。如果您希望DataFrame具有正确的列名(如您在所需结果中所示),则可以使用aggregate函数:

group = df.groupby(['id','name','number']).size().groupby(level=0).agg({'count(name-number':'size'})

答案 1 :(得分:4)

你可以这样做:

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

<强>更新

OP要求数据框中的结果。获得此功能的一种方法是使用带有length函数的aggregate,这将返回一个数据帧,其中包含每对唯一条目的数量:

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

答案 2 :(得分:0)

尝试

 df.groupby('id').apply(lambda x: x.drop('id', 
  axis=1).drop_duplicates().shape[0]).reset_index()

答案 3 :(得分:0)

获取列组合的唯一值列表:

grouped= df.groupby('name').number.unique()
for k,v in grouped.items():
    print(k)
    print(v)

输出:

jack
[2]
peter
[8]
sam
[76  8]

根据另一列获取一列的值:

df.groupby('name').number.value_counts().unstack().fillna(0)

输出:

number  2   8   76
name            
jack    1.0 0.0 0.0
peter   0.0 1.0 0.0
sam     0.0 1.0 1.0