考虑以下数据帧:
      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
Run Code Online (Sandbox Code Playgroud)
我想为每个值找到A其他列中唯一值的数量.
我认为以下会这样做:
df.groupby('A').apply(lambda x: x.nunique())
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
AttributeError: 'DataFrame' object has no attribute 'nunique'
Run Code Online (Sandbox Code Playgroud)我也尝试过:
df.groupby('A').nunique()
Run Code Online (Sandbox Code Playgroud)
但我也得到了错误:
AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'
Run Code Online (Sandbox Code Playgroud)最后我尝试了:
df.groupby('A').apply(lambda x: x.apply(lambda y: y.nunique()))
Run Code Online (Sandbox Code Playgroud)
返回:
      A  B  E
A            
bar   1  2  1
flux  1  2  2
foo   1  3  2
Run Code Online (Sandbox Code Playgroud)
而且似乎是正确的.但奇怪的是,它也会返回A结果中的列.为什么?
该DataFrame对象没有nunique.您必须选择要应用的列nunique().您可以使用简单的点运算符执行此操作:
df.groupby('A').apply(lambda x: x.B.nunique())
Run Code Online (Sandbox Code Playgroud)
将打印:
A
bar     2
flux    2
foo     3
Run Code Online (Sandbox Code Playgroud)
并做:
df.groupby('A').apply(lambda x: x.E.nunique())
Run Code Online (Sandbox Code Playgroud)
将打印:
A
bar     1
flux    2
foo     2
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用以下函数调用一个函数:
df.groupby('A').aggregate({'B': lambda x: x.nunique(), 'E': lambda x: x.nunique()})
Run Code Online (Sandbox Code Playgroud)
将打印:
      B  E
A
bar   2  1
flux  2  2
foo   3  2
Run Code Online (Sandbox Code Playgroud)
要回答关于为什么你的递归lambda打印A列的问题,这是因为当你执行groupby/ apply操作时,你现在正在迭代三个DataFrame对象.每个DataFrame对象都是DataFrame原始对象的子对象.对其应用操作将应用于每个操作Series.Series每个人都有三个DataFrame应用nunique()运算符.
第一次Series上每个被评估的DataFrame是A Series,既然你已经做了groupby的A,你知道,在每一个DataFrame,只有一个在独特的价值A Series.这就解释了为什么你最终会得到一个A包含所有内容的结果列1.