pandas dataframe按Month和Col2分组后取Val最大值对应Col1的实现方法
实现代码
首先导入pandas并构造你的示例数据:
import pandas as pd df = pd.DataFrame({ 'Month': ['A', 'A', 'A', 'B', 'B', 'B'], 'Col1': ['p', 'q', 'r', 'x', 'y', 'z'], 'Col2': ['a1', 'a1', 'b2', 'a1', 'b2', 'b2'], 'Val': [31, 78, 13, 54, 56, 65] })
方法1:排序后分组取首行(逻辑直观)
# 按Val降序排序,确保每个分组的最大值排在最前面 df_sorted = df.sort_values('Val', ascending=False) # 按Month、Col2分组,取每组第一行的Col1值 grouped = df_sorted.groupby(['Month', 'Col2'], as_index=False)['Col1'].first() # 转为宽表,把Col2的值作为列名 result = grouped.pivot(index='Month', columns='Col2', values='Col1')\ .reset_index()\ .rename_axis(columns=None) # 去掉多余的列索引名
方法2:取最大值行索引(性能更优,适合大数据量)
# 取每个(Month, Col2)组内Val最大值对应的行索引 max_val_index = df.groupby(['Month', 'Col2'])['Val'].idxmax() # 提取对应行数据后转宽表 result = df.loc[max_val_index, ['Month', 'Col2', 'Col1']]\ .pivot(index='Month', columns='Col2', values='Col1')\ .reset_index()\ .rename_axis(columns=None)
两种方法输出的result都符合预期:
| Month | a1 | b2 |
|---|---|---|
| A | q | r |
| B | x | z |
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

