【问题标题】:Python Pandas: Group by and count distinct value over all columns?Python Pandas:分组并计算所有列的不同值?
【发布时间】:2016-10-12 17:16:12
【问题描述】:

我有 df

      column1  column2  column3  column4
0    name        True        True         NaN
1    name        NaN        True         NaN
2   name1        NaN        True         True 
3   name1        True        True       True 

我想对我正在尝试的所有列进行分组并计算不同的值:

df.groupby('column1').nunique()

但我收到此错误。

AttributeError: 'DataFrameGroupBy' 对象没有属性 'nunique'

有人有建议吗?

【问题讨论】:

    标签: python pandas count unique distinct


    【解决方案1】:

    您可以将stack 用于Series,然后将Series.groupbySeriesGroupBy.nunique 一起使用:

    df1 = df.set_index('column1').stack()
    
    print (df1.groupby(level=[0,1]).nunique(dropna=False).unstack())
    

    示例:

    print (df)
      column1 column2 column3 column4
    0    name    True    True     NaN
    1    name     NaN    True     NaN
    2   name1     NaN    True    True
    3   name1    True    True    True
    
    df1 = df.set_index('column1').stack(dropna=False)
    print (df1)
    column1         
    name     column2    True
             column3    True
             column4     NaN
             column2     NaN
             column3    True
             column4     NaN
    name1    column2     NaN
             column3    True
             column4    True
             column2    True
             column3    True
             column4    True
    dtype: object
    
    print (df1.groupby(level=[0,1]).nunique(dropna=False).unstack(fill_value=0))
             column2  column3  column4
    column1                           
    name           2        1        1
    name1          2        1        1
    
    print (df1.groupby(level=[0,1]).nunique().unstack(fill_value=0))
             column2  column3  column4
    column1                           
    name           1        1        0
    name1          1        1        1
    

    另一个双apply的解决方案:

    print (df.groupby('column1')
             .apply(lambda x: x.iloc[:,1:].apply(lambda y: y.nunique(dropna=False))))
             column2  column3  column4
    column1                           
    name           2        1        1
    name1          2        1        1
    
    print (df.groupby('column1').apply(lambda x: x.iloc[:,1:].apply(lambda y: y.nunique())))
             column2  column3  column4
    column1                           
    name           1        1        0
    name1          1        1        1
    

    【讨论】:

    • 这只给了我第一列的计数。我需要所有列的唯一计数
    • 对不起,我不太明白。但现在我认为这是正确的——我在indexSeries 的两个级别上添加了groupby
    • 是的,它的更正只在我需要拆开它以获得正确的数据帧时才起作用
    • 刚刚发现计数不正确。因为我的数据只有 True 或 NaN 值。你的方法怎么可能计数有误?
    • 您只需将参数dropna=False 添加到nunique - print (df1.groupby(level=[0,1]).nunique(dropna=False).unstack())
    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 2019-10-11
    • 2014-09-05
    • 2015-04-22
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多