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)
你可以做:
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)
您可以将两个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)