You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改MultiIndex DataFrame:保留分组最大Rank值其余设为NaN

问题:仅保留分组内Rank最大值,其余设为NaN

我有如下DataFrame A:

I1I2Rank
1a1
1b2
2a1
2b2
2c3

通过df.groupby('I1').max()得到每个I1对应的Rank最大值:

I1Rank
12
23

需要修改原DataFrame,仅保留每个I1分组中Rank等于最大值的行的Rank值,其余行设为NaN,期望输出如下:

I1I2Rank
1aNaN
1b2
2aNaN
2bNaN
2c3

解决方案

方法一:使用groupby.transform快速实现

无需额外合并操作,直接通过transform生成每组的最大值序列,再做条件判断:

import pandas as pd

# 构造原始DataFrame
df = pd.DataFrame({
    'I1': [1, 1, 2, 2, 2],
    'I2': ['a', 'b', 'a', 'b', 'c'],
    'Rank': [1, 2, 1, 2, 3]
})

# 替换Rank值:仅保留分组内等于最大值的行,其余设为NaN
df['Rank'] = df['Rank'].where(df['Rank'] == df.groupby('I1')['Rank'].transform('max'), pd.NA)

print(df)

运行后输出:

I1 I2  Rank
0   1  a  <NA>
1   1  b     2
2   2  a  <NA>
3   2  b  <NA>
4   2  c     3

方法二:先分组取最大值再合并(更直观)

如果需要清晰的步骤,可以先获取分组最大值,合并后再做判断:

import pandas as pd

df = pd.DataFrame({
    'I1': [1, 1, 2, 2, 2],
    'I2': ['a', 'b', 'a', 'b', 'c'],
    'Rank': [1, 2, 1, 2, 3]
})

# 1. 获取每个I1的Rank最大值,重置索引以便合并
max_rank = df.groupby('I1')['Rank'].max().reset_index()

# 2. 将最大值合并到原DataFrame
df = df.merge(max_rank, on='I1', suffixes=('', '_max'))

# 3. 替换Rank值,清理临时列
df['Rank'] = df['Rank'].where(df['Rank'] == df['Rank_max'], pd.NA)
df = df.drop('Rank_max', axis=1)

print(df)

输出结果和方法一一致。


内容的提问来源于stack exchange,提问作者PrinceZard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:15:38