每列中每列的唯一值数量
问题内容:
考虑以下数据框:
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
结果中的列。为什么?
问题答案:
该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()
Series
每个DataFrame
值的第一个被评估A
Series
,并且因为您完成了一个groupby
on
A
,您知道在每个DataFrame
值中,只有一个唯一的值A
Series
。这就解释了为什么最终会给您一个A
包含所有的结果列1
。