使用 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

我确定有一种方法可以更干净地完成此操作并且无需使用循环,但我似乎无法解决。任何帮助将非常感激。

原文由 user1684046 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 445
2 个回答

我想你可以使用 SeriesGroupBy.nunique

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

Another solution with unique , then create new df by DataFrame.from_records , reshape to Series by stack and last value_counts :

 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

原文由 jezrael 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

原文由 datapug 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题