![](/img/trans.png)
[英]Count the frequency of unique values in every pandas column using 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.