考虑以下数据框:
A B E
0 bar one 1
1 bar three 1
2 flux six 1
3 flux three 2
4 foo five 2
5 foo one 1
6 foo two 1
7 foo two 2
我想为A
的每个值找到其他列中唯一值的数量。
我认为以下情况会这样做:
df.groupby('A').apply(lambda x: x.nunique())
但是我收到了错误:
AttributeError: 'DataFrame' object has no attribute 'nunique'
我也尝试过:
df.groupby('A').nunique()
但我也得到了错误:
AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'
最后我尝试了:
df.groupby('A').apply(lambda x: x.apply(lambda y: y.nunique()))
返回:
A B E
A
bar 1 2 1
flux 1 2 2
foo 1 3 2
似乎是正确的。但奇怪的是,它还会在结果中返回列A
。为什么呢?
答案 0 :(得分:7)
DataFrame
对象没有nunique
。您必须选择要应用nunique()
的列。您可以使用简单的点运算符执行此操作:
df.groupby('A').apply(lambda x: x.B.nunique())
将打印:
A
bar 2
flux 2
foo 3
并且正在做:
df.groupby('A').apply(lambda x: x.E.nunique())
将打印:
A
bar 1
flux 2
foo 2
或者,您可以使用以下方法通过一个函数调用执行此操作:
df.groupby('A').aggregate({'B': lambda x: x.nunique(), 'E': lambda x: x.nunique()})
将打印:
B E
A
bar 2 1
flux 2 2
foo 3 2
要回答关于为什么递归lambda打印A
列的问题,这是因为当您执行groupby
/ apply
操作时,您现在正在迭代三个{ {1}}个对象。每个DataFrame
对象都是原始对象的DataFrame
。对其应用操作会将其应用于每个DataFrame
。每Series
个Series
您正在应用DataFrame
运算符。
每个nunique()
评估的第一个Series
是DataFrame
A
,因为您在Series
上完成了groupby
,您知道在每个A
中,DataFrame
A
中只有一个唯一值。这解释了为什么您最终获得了包含所有Series
的{{1}}结果列。
答案 1 :(得分:2)
我遇到了同样的问题。 将pandas升级到最新版本为我解决了这个问题。
df.groupby('A').nunique()
上述代码在Pandas版本0.19.2中对我不起作用。 我将它升级到Pandas版本0.21.1并且有效。
您可以使用以下代码检查版本:
print('Pandas version ' + pd.__version__)