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
相关产品推荐
相关产品推荐

