我需要从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
同样,这与预期输出'
不同答案 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'>