每个列的唯一值数

时间:2014-11-18 20:00:06

标签: python pandas

考虑以下数据框:

      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'
    
  2. 我也尝试过:

    df.groupby('A').nunique()
    

    但我也得到了错误:

    AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'
    
  3. 最后我尝试了:

    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。为什么呢?

2 个答案:

答案 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。每SeriesSeries您正在应用DataFrame运算符。

每个nunique()评估的第一个SeriesDataFrame 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__)