考虑以下数据框:
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其他列中唯一值的数量。
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结果中的列。为什么?
该DataFrame对象没有nunique,只有Series。您必须选择要应用于哪一列nunique()。您可以使用简单的点运算符执行此操作:
DataFrame
nunique
Series
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操作时,您现在要遍历三个DataFrame对象。每个DataFrame对象都是DataFrame原始对象的子对象。将操作应用于该操作将应用于每个操作Series。您要应用运算符的Series每个对象有3个。DataFrame``nunique()
groupby
apply
DataFrame``nunique()
Series每个DataFrame值的第一个被评估A Series,并且因为您完成了一个groupbyon A,您知道在每个DataFrame值中,只有一个唯一的值A Series。这就解释了为什么最终会给您一个A包含所有的结果列1。
1