我有以下形式的数据:
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 许可协议
我想你可以使用
SeriesGroupBy.nunique
:Another solution with
unique
, then create newdf
byDataFrame.from_records
, reshape toSeries
bystack
and lastvalue_counts
: