Python熊猫:如何根据多个列分组并计算唯一值?
我有datafarme df:Python熊猫:如何根据多个列分组并计算唯一值?,python,pandas,group-by,unique,Python,Pandas,Group By,Unique,我有datafarme df: id name number 1 sam 76 2 sam 8 2 peter 8 4 jack 2 我想按“id”列分组,并根据(名称、编号)对计算唯一值的数量 我尝试过这个,但不起作用: df.groupby('id')[('number','name')].nunique().reset_index() 你可以做: import pandas df = pandas.DataFrame({"id": [1, 2, 3, 4], "nam
id name number
1 sam 76
2 sam 8
2 peter 8
4 jack 2
我想按“id”列分组,并根据(名称、编号)对计算唯一值的数量
我尝试过这个,但不起作用:
df.groupby('id')[('number','name')].nunique().reset_index()
你可以做:
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
for p in g.groups:
print p, " has ", len(g.groups[p]), " entries"
其中:
{('jack', 2): [3], ('peter', 8): [2], ('sam', 8): [0, 1]}
('peter', 8) has 1 entries
('jack', 2) has 1 entries
('sam', 8) has 2 entries
要获取每对的唯一条目数,可以执行以下操作:
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
for p in g.groups:
print p, " has ", len(g.groups[p]), " entries"
其中:
{('jack', 2): [3], ('peter', 8): [2], ('sam', 8): [0, 1]}
('peter', 8) has 1 entries
('jack', 2) has 1 entries
('sam', 8) has 2 entries
更新:
OP要求在数据帧中显示结果。一种方法是将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
试一试
要获取列组合的唯一值列表,请执行以下操作:
grouped= df.groupby('name').number.unique()
for k,v in grouped.items():
print(k)
print(v)
输出:
jack
[2]
peter
[8]
sam
[76 8]
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
要基于另一列获取一列的值数,请执行以下操作:
df.groupby('name').number.value_counts().unstack().fillna(0)
输出:
jack
[2]
peter
[8]
sam
[76 8]
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
您只需组合两个
groupby
s即可获得所需的结果
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'})
谢谢你的回答。我更希望我能用一个python熊猫把戏和一个数据帧来实现它,你知道怎么做吗?你知道我怎么才能得到唯一的组吗?因为目前的纸条上也有重复的部分,我才意识到你的答案并没有回答我的问题。因为我想知道每个id的唯一(名称,数字)对的数量。您所编码的代码给出了每个(名称,数字)对的条目数量,这是熊猫数据帧中分组和计数的最佳答案。/@User您的表没有意义,计数1为1,它应该为2,有2个数字2,2个“山姆,还有2尺8寸。请给出一个清晰的示例数据和输出。