小编典典

每列中每列的唯一值数量

python

考虑以下数据框:

      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其他列中唯一值的数量。

  1. 我认为以下可以做到:
    df.groupby('A').apply(lambda x: x.nunique())
    

但我得到一个错误:

    AttributeError: 'DataFrame' object has no attribute 'nunique'
  1. 我也尝试过:
    df.groupby('A').nunique()
    

但是我也得到了错误:

    AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'
  1. 最后,我尝试了:
    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结果中的列。为什么?


阅读 146

收藏
2021-01-20

共1个答案

小编典典

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,并且因为您完成了一个groupbyon
A,您知道在每个DataFrame值中,只有一个唯一的值A Series。这就解释了为什么最终会给您一个A包含所有的结果列1

2021-01-20