Python 3.x - nunique不适用于groupby

时间:2016-10-18 13:01:20

标签: group-by unique

我需要从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

同样,这与预期输出'

不同

2 个答案:

答案 0 :(得分:0)

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

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

我希望它有所帮助!

答案 1 :(得分:0)

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

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

我测试了你的代码。我把输出作为数据帧的唯一一次是我在下面做的时候。我在哪里提到了as_index参数并删除了nunique值的长度计算。

>>> 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'>