具有多列的熊猫每组的最大值/为啥它仅在展平时才有效?
Posted
技术标签:
【中文标题】具有多列的熊猫每组的最大值/为啥它仅在展平时才有效?【英文标题】:pandas largest value per group with multi columns / why does it only work when flattening?具有多列的熊猫每组的最大值/为什么它仅在展平时才有效? 【发布时间】:2021-01-08 07:06:42 【问题描述】:对于熊猫数据框:
import pandas as pd
df = pd.DataFrame(
'id': [1, 1, 2, 1], 'anomaly_score':[5, 10, 8, 100], 'match_level_0':[np.nan, 1, 1, 1], 'match_level_1':[np.nan, np.nan, 1, 1], 'match_level_2':[np.nan, 1, 1, 1]
)
display(df)
df = df.groupby(['id', 'match_level_0']).agg(['mean', 'sum'])
我想计算每组的最大行数。
df.columns = ['__'.join(col).strip() for col in df.columns.values]
df.groupby(['id'])['anomaly_score__mean'].nlargest(2)
有效,但需要展平列的多索引。
我想直接使用,
df.groupby(['id'])[('anomaly_score', 'mean')].nlargest(2)
但是由于找不到密钥而失败。 有趣的是,它在不分组时工作得很好:
df[('anomaly_score', 'mean')].nlargest(2)
【问题讨论】:
【参考方案1】:对我来说,Series
与MultiIndex
的第一级工作分组,但似乎错误为什么不能像您的解决方案那样工作:
print (df[('anomaly_score', 'mean')].groupby(level=0).nlargest(2))
id match_level_0
1 1.0 55
2 1.0 8
Name: (anomaly_score, mean), dtype: int64
print (df[('anomaly_score', 'mean')].groupby(level='id').nlargest(2))
【讨论】:
以上是关于具有多列的熊猫每组的最大值/为啥它仅在展平时才有效?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?
Firebase 云消息传递的 getToken() 仅在我省略 usePublicVapidKey 方法时才有效,为啥?