具有多列的熊猫每组的最大值/为啥它仅在展平时才有效?

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】:

对我来说,SeriesMultiIndex 的第一级工作分组,但似乎错误为什么不能像您的解决方案那样工作:

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))

【讨论】:

以上是关于具有多列的熊猫每组的最大值/为啥它仅在展平时才有效?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql获取具有多列的每个组的最大值[重复]

如何将熊猫数据框值除以每组的第一行?

如何计算熊猫数据框中每组的行数并将其添加到原始数据中

仅在最大日期而不是在组的其他条目中显示具有特定值的组

为啥 Thread.Abort 仅在 isBackground 属性设置为 true 时才有效?

Firebase 云消息传递的 getToken() 仅在我省略 usePublicVapidKey 方法时才有效,为啥?