Python 使用groupby计算唯一值

Python 使用groupby计算唯一值,python,pandas,group-by,Python,Pandas,Group By,我有以下形式的数据: df = pd.DataFrame({ 'group': [1, 1, 2, 3, 3, 3, 4], 'param': ['a', 'a', 'b', np.nan, 'a', 'a', np.nan] }) print(df) # group param # 0 1 a # 1 1 a # 2 2 b # 3 3 NaN # 4 3 a # 5 3

我有以下形式的数据:

df = pd.DataFrame({
    'group': [1, 1, 2, 3, 3, 3, 4],
    'param': ['a', 'a', 'b', np.nan, 'a', 'a', np.nan]
})
print(df)

#    group param
# 0      1     a
# 1      1     a
# 2      2     b
# 3      3   NaN
# 4      3     a
# 5      3     a
# 6      4   NaN
组中的非空值始终相同。我想对每个组(如果存在)的非空值计数一次,然后找到每个值的总计数

我目前正在以以下(笨重和低效)方式进行此操作:

我确信有一种方法可以更干净地完成这项工作,而不需要使用循环,但我似乎无法解决这个问题。非常感谢您的帮助。

我想您可以使用:

使用另一个解决方案,然后通过创建新的
df
by,重新塑造为
Series
by,最后:


如果您不仅要计算唯一值,还要计算其他聚合函数,这只是解决方案的一个附加组件:

df.groupby(['group']).agg(['min','max','count','nunique'])

希望你觉得它有用

我知道这篇文章发布已经有一段时间了,但我认为这也会有所帮助。 我想计算唯一值并按这些唯一值的数量过滤组,我就是这样做的:

df.groupby('group').agg(['min','max','count','nunique']).reset_index(drop=False)

上述答案也适用,但如果您想向现有数据框添加具有唯一_计数的列,可以使用

输出:

   group param  distinct_count
0      1     a             2.0
1      1     a             2.0
2      2     b             1.0
3      3   NaN             NaN
4      3     a             2.0
5      3     a             2.0
6      4   NaN             NaN
并检查@jezrael的团队计数是否较高

print (df.groupby('param')['group'].nunique())

我使用
df=pd.DataFrame({'group':[1,1,2,3,3,4],'param':['a','c','b',np.nan','c','a',np.nan]})测试它。
,但您的代码返回不同的输出,因为在每个
组中只使用列表的第一个唯一元素。我的代码返回所有唯一的值。如果我知道你需要什么,请检查一下。谢谢你。我们是怎么得到这个专栏的names@dondapati-添加
.reset\u index()
df.groupby('group').agg(['min','max','count','nunique']).reset_index(drop=False)
df['distinct_count'] = df.groupby(['param'])['group'].transform('nunique')
   group param  distinct_count
0      1     a             2.0
1      1     a             2.0
2      2     b             1.0
3      3   NaN             NaN
4      3     a             2.0
5      3     a             2.0
6      4   NaN             NaN
print (df.groupby('param')['group'].nunique())
param
a    2
b    1
Name: group, dtype: int64