每个列的唯一值数

Ame*_*ina 6 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
Run Code Online (Sandbox Code Playgroud)

我想为每个值找到A其他列中唯一值的数量.

  1. 我认为以下会这样做:

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

    df.groupby('A').nunique()
    
    Run Code Online (Sandbox Code Playgroud)

    但我也得到了错误:

    AttributeError: 'DataFrameGroupBy' object has no attribute 'nunique'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最后我尝试了:

    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结果中的列.为什么?

huu*_*huu 7

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上每个被评估的DataFrameA Series,既然你已经做了groupbyA,你知道,在每一个DataFrame,只有一个在独特的价值A Series.这就解释了为什么你最终会得到一个A包含所有内容的结果列1.