如何在DataFrame索引值变更前获取对应分组的最大值?
解决DataFrame分组标记最大值到组最后一行的问题
现有代码的问题
你的代码逻辑存在核心错误:
df['column_b'][i]是单个标量值,调用.max()只会返回它本身,根本不是分组最大值;- 循环里的
if df['index_a'][i] == 0条件没有任何分组判断的意义,完全无法区分不同的index_a组; - 循环遍历
iloc[:-1]还会漏掉最后一行数据。
正确实现方案
不需要用低效的循环,利用pandas的分组和位移判断可以高效实现需求:
- 计算每个
index_a组对应的column_b最大值,并映射到该组的每一行; - 判断每行是否是当前组的最后一行(通过对比当前行与下一行的
index_a值); - 仅在每组的最后一行将最大值写入
all_max列,其余行留空(或设为NaN)。
代码示例
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'index_a': [0, 0, 0, 1, 1, 2], 'column_b': [5, 8, 3, 2, 7, 4] }) # 步骤1:计算每组的column_b最大值,映射到每行 df['group_max'] = df.groupby('index_a')['column_b'].transform('max') # 步骤2:判断是否为每组最后一行 is_last_in_group = df['index_a'] != df['index_a'].shift(-1) # 步骤3:初始化all_max并赋值 df['all_max'] = float('nan') df.loc[is_last_in_group, 'all_max'] = df.loc[is_last_in_group, 'group_max'] # 可选:删除临时辅助列 df = df.drop('group_max', axis=1) print(df)
运行结果
| index_a | column_b | all_max |
|---|---|---|
| 0 | 5 | nan |
| 0 | 8 | nan |
| 0 | 3 | 8 |
| 1 | 2 | nan |
| 1 | 7 | 7 |
| 2 | 4 | 4 |
内容的提问来源于stack exchange,提问作者Nazmi Husaini
相关产品推荐
相关产品推荐

