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

Use*_*YmY 2 python group-by unique pandas

我有datafarme df:

id name number
1 sam   76
2 sam    8
2 peter  8 
4 jack   2
Run Code Online (Sandbox Code Playgroud)

我想对“ id”列进行分组,并基于(名称,数字)对计算唯一值的数量?

id count(name-number)
1    1
2    2
4    1     
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了,但是不起作用:

df.groupby('id')[('number','name')].nunique().reset_index()
Run Code Online (Sandbox Code Playgroud)

mvd*_*mvd 5

你可以做:

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
Run Code Online (Sandbox Code Playgroud)

这使:

{('jack', 2): [3], ('peter', 8): [2], ('sam', 8): [0, 1]}
Run Code Online (Sandbox Code Playgroud)

要获取每对唯一条目的数量,您可以执行以下操作:

for p in g.groups: 
    print p, " has ", len(g.groups[p]), " entries"
Run Code Online (Sandbox Code Playgroud)

这使:

('peter', 8)  has  1  entries
('jack', 2)  has  1  entries
('sam', 8)  has  2  entries
Run Code Online (Sandbox Code Playgroud)

更新:

OP要求在数据框中输入结果。一种实现方法是aggregate与length函数一起使用,该函数将返回一个数据帧,其中包含每对唯一条目的数量:

d = g.aggregate(len)
print d.reset_index().rename(columns={"id": "num_entries"})
Run Code Online (Sandbox Code Playgroud)

给出:

    name  number  num_entries
0   jack       2           1
1  peter       8           1
2    sam       8           2
Run Code Online (Sandbox Code Playgroud)


ste*_*des 5

您可以将两个groupbys 组合以获得所需的结果。

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()
Run Code Online (Sandbox Code Playgroud)

第一个groupby将计算完整的原始组合集(从而使要计算的列唯一)。第二个groupby将计算您想要的每一列的唯一出现次数(并且您可以使用第一个groupby将该列放入索引的事实)。

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

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