繁体   English   中英

使用 pandas groupby 计算唯一值

[英]Count unique values using pandas groupby

我有以下形式的数据:

 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

组内的非空值始终相同。 我想为每个组(它存在的地方)计算一次非空值,然后找到每个值的总计数。

我目前正在以以下(笨拙且低效)的方式执行此操作:

 param = [] for _, group in df[df.param.notnull()].groupby('group'): param.append(group.param.unique()[0]) print(pd.DataFrame({'param': param}).param.value_counts()) # a 2 # b 1

我确信有一种方法可以更干净地做到这一点并且不使用循环,但我似乎无法解决它。 任何帮助将非常感激。

我认为您可以使用SeriesGroupBy.nunique

 print (df.groupby('param')['group'].nunique()) param a 2 b 1 Name: group, dtype: int64

另一个具有unique解决方案,然后通过DataFrame.from_records创建新的df ,通过stack和最后一个value_counts重塑为Series

 a = df[df.param.notnull()].groupby('group')['param'].unique() print (pd.DataFrame.from_records(a.values.tolist()).stack().value_counts()) a 2 b 1 dtype: int64

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

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

上面的答案也有效,但如果您想将具有 unique_counts 的列添加到现有数据框,您可以使用transform

 df['distinct_count'] = df.groupby(['param'])['group'].transform('nunique')

output:

 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())
 param a 2 b 1 Name: group, dtype: int64

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

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

这种方式更快更方便:

 df.groupby('param').agg({'group':lambda x: len(pd.unique(x))})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM