Pandas如何分组后基于一列最小值、另一列最大值返回对应列值?
pandas实现分组筛选赋值方案
首先导入依赖并构造测试数据:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'column1': ['A']*7, 'column2': ['B']*7, 'column3': [5, 2, 10, 1, 1, 1, 1], 'column4': [4234, 432, 123, 123, 124, 125, 126], 'column5': [123, 3243, 43, 45, 23243, 234, 23] })
核心实现代码
# 初始化column6为空值 df['column6'] = pd.NA # 按column1、column2分组遍历处理 for _, group in df.groupby(['column1', 'column2']): # 步骤1:获取当前组column3的最小值,筛选对应行 min_c3 = group['column3'].min() c3_filter_rows = group[group['column3'] == min_c3] # 步骤2:获取筛选行中column4最大值对应的行索引 max_c4_idx = c3_filter_rows['column4'].idxmax() # 步骤3:给对应行的column6赋值为该行的column5值 df.loc[max_c4_idx, 'column6'] = c3_filter_rows.loc[max_c4_idx, 'column5']
运行后输出print(df)即可得到你期望的结果:
| column1 | column2 | column3 | column4 | column5 | column6 |
|---|---|---|---|---|---|
| A | B | 5 | 4234 | 123 | |
| A | B | 2 | 432 | 3243 | |
| A | B | 10 | 123 | 43 | |
| A | B | 1 | 123 | 45 | |
| A | B | 1 | 124 | 23243 | |
| A | B | 1 | 125 | 234 | |
| A | B | 1 | 126 | 23 | 23 |
如果你只需要提取对应的目标值不需要新增column6,可以直接用如下代码获取:
def get_target(group): return group[group['column3'] == group['column3'].min()].nlargest(1, 'column4')['column5'].iloc[0] # 输出每个分组对应的目标值 print(df.groupby(['column1', 'column2']).apply(get_target))
内容的提问来源于stack exchange,提问作者royalewithcheese
相关产品推荐
相关产品推荐

