【问题标题】:Python 3.x - nunique does not work with groupbyPython 3.x - nunique 不适用于 groupby
【发布时间】:2016-10-18 13:01:19
【问题描述】:

我需要从 df 计算唯一用户数。我正在使用 groupby 功能 -

df - 
col1 col2 col3 col4
a    p    x    7 
a    p    x    3
b    q    y    5
b    r    y    2
c    s    z    5
c    t    z    9

Unique_df = df.groupby(['col1','col2','col3'],as_index=False)['col4'].nunique()

预期输出

Unique_df -
col1 col2 col3 col4
a    p    x    2 
b    q    y    1
b    r    y    1
c    s    z    1
c    t    z    1

不幸的是,我收到以下错误 - AttributeError: 'DataFrameGroupBy' 对象没有属性 'nunique'

我怎样才能得到预期的输出?

编辑 - 我试过了——

df.groupby(['col1','col2','col3'],as_index=False)['col4'].apply(lambda x: len(x.unique()))

但不幸的是它给了我一个系列 -

col1 col2 col3 
a    p    x    7 
a    p    x    3
b    q    y    5
b    r    y    2
c    s    z    5
c    t    z    9

我不想要这个。我想要一个我在“预期输出”中提到的数据框

我尝试使用 - 将此系列转换为数据框 - pd.DataFrame(df)

但这给了-

               col4
col1 col2 col3 
a    p    x    7 
a    p    x    3
b    q    y    5
b    r    y    2
c    s    z    5
c    t    z    9

同样,这与“预期输出”不同

【问题讨论】:

    标签: group-by unique


    【解决方案1】:

    根据 pandas 的文档,nunique 函数的返回值应该只是一个系列。

    https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.nunique.html

    我测试了您的代码。我唯一一次将输出作为数据框是在我执行以下操作时。我确实提到了 as_index 参数并删除了唯一值的长度计算。

    >>> var1 = df.groupby(['col1', 'col2', 'col3', 'col4']).apply(lambda x:x.nunique())
    >>> type(var1)
    <class 'pandas.core.frame.DataFrame'>
    
    >>> var2 = var1 = df.groupby(['col1', 'col2', 'col3', 'col4']).apply(lambda x:len(x.nunique()))
    >>> type(var2)
    <class 'pandas.core.series.Series'>
    

    似乎当我尝试使用 as_index=False 和 Len() 函数时,该值变成了一个系列而不是一个数据框。不确定这是否能解决问题。但我希望它可以帮助您尝试不同的选择。我建议将不同的组合放入变量中,并在更改它们时测试它们的类型和行为。

    >>> var1 = df.groupby(['col1', 'col2', 'col3', 'col4']).apply(lambda x:x.nunique())
    >>> var1
                         col1  col2  col3  col4
    col1 col2 col3 col4                        
    a    p    x    2        1     1     1     1
    b    q    y    1        1     1     1     1
         r    y    1        1     1     1     1
    c    s    z    1        1     1     1     1
         t    z    1        1     1     1     1
    
    >>> type(var1)
    <class 'pandas.core.series.Series'>
    

    【讨论】:

      【解决方案2】:

      几天前我遇到了同样的问题。我使用了 group.nunique() ,它在我的计算机上工作但在另一台计算机上没有工作。

      我通过更新 anaconda (conda update --all) 解决了这个问题。我怀疑(但不要相信我的话)这是由过时的 numpy 库(conda update numpy)引起的......

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2023-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        相关资源
        最近更新 更多