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

Pandas透视DataFrame后获取最大值关联的col5、col6行数据方法

解决方案

你需要先定位每个col4+col2分组下col7最大值对应的原始行索引,再提取对应的col5、col6字段即可,以下是可直接运行的完整实现:

核心实现代码

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
    'col2': ['test1', 'test1', 'test1', 'test1', 'test2', 'test2', 'test2',
             'test2', 'test3', 'test3', 'test3', 'test3', 'test4', 'test5',
             'test1', 'test1'],
    'col3': ['t1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1',
             't1', 't1', 't1', 't1', 't1'],
    'col4': ['input1', 'input2', 'input3', 'input4', 'input1', 'input2',
             'input3', 'input4', 'input1', 'input2', 'input3', 'input5',
             'input2', 'input6', 'input1', 'input1'],
    'col5': ['result1', 'result2', 'result3', 'result4', 'result1', 'result2',
             'result3', 'result4', 'result1', 'result2', 'result3', 'result4',
             'result2', 'result1', 'result2', 'result6'],
    'col6': [10, 20, 30, 40, 10, 20, 30, 40, 10, 20, 30, 50, 20, 100, 10, 10],
    'col7': [100.2, 101.2, 102.3, 101.4, 100.0, 103.0, 104.0, 105.0, 102.0,
             87.0, 107.0, 110.2, 120.0, 88.0, 106.2, 101.1]
})

# 步骤1:获取每个col4+col2分组下col7最大值对应的原始行
# 场景1:仅保留每个分组第一个最大值行
max_idx = df.groupby(['col4', 'col2'])['col7'].idxmax()
max_rows = df.loc[max_idx, ['col4', 'col2', 'col5', 'col6', 'col7']].reset_index(drop=True)

# 场景2:如果有并列最大值,需要保留所有行,替换上面两句为以下代码
# df['group_max_col7'] = df.groupby(['col4', 'col2'])['col7'].transform('max')
# max_rows = df[df['col7'] == df['group_max_col7']][['col4', 'col2', 'col5', 'col6', 'col7']].reset_index(drop=True)

结果表1:和原透视表结构一致,每个单元格关联对应col5、col6信息

# 可自定义单元格展示格式,也可存为元组方便后续代码调用
max_rows['cell_info'] = max_rows.apply(lambda x: f"col5:{x['col5']} | col6:{x['col6']} | max_col7:{x['col7']}", axis=1)
pivot_info = max_rows.pivot_table(values='cell_info', index='col4', columns='col2', aggfunc='first')
# 保留原逻辑:过滤掉所有值都小于100的行
pivot_info = pivot_info[(pivot_info.applymap(lambda x: float(x.split('max_col7:')[-1]) if pd.notna(x) else 0) >= 100).any(axis=1)]\
.fillna('').reset_index().rename_axis(None, axis=1)

结果表2:扁平化结构化表,每行对应一条最大值关联的原始记录

flat_result = max_rows[max_rows['col7'] >= 100].reset_index(drop=True)

补充说明

  • 两种结果都已经包含你需要的col5、col6和对应最大值的关联关系
  • 可根据实际需求调整cell_info的拼接格式,或者直接存储多字段元组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 09:36:03