如何修改MultiIndex DataFrame:保留分组最大Rank值其余设为NaN
问题:仅保留分组内Rank最大值,其余设为NaN
我有如下DataFrame A:
| I1 | I2 | Rank |
|---|---|---|
| 1 | a | 1 |
| 1 | b | 2 |
| 2 | a | 1 |
| 2 | b | 2 |
| 2 | c | 3 |
通过df.groupby('I1').max()得到每个I1对应的Rank最大值:
| I1 | Rank |
|---|---|
| 1 | 2 |
| 2 | 3 |
需要修改原DataFrame,仅保留每个I1分组中Rank等于最大值的行的Rank值,其余行设为NaN,期望输出如下:
| I1 | I2 | Rank |
|---|---|---|
| 1 | a | NaN |
| 1 | b | 2 |
| 2 | a | NaN |
| 2 | b | NaN |
| 2 | c | 3 |
解决方案
方法一:使用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
相关产品推荐
相关产品推荐

