如何在Pandas中按Mode分组后,将Indicator最值的对应列值展示在同一DataFrame?
问题与简便解决方案
需求说明
现有数据集通过以下代码按Mode列分组,仅提取了Indicator列的最大、最小值:
import pandas as pd df = pd.read_csv(r'relative.csv') Grouped = df.groupby('Mode')['Indicator'].agg(['max', 'min']) print(Grouped)
需要将这些最值对应的其他列关联值一并展示在同一个DataFrame中,以下是两种简便实现方案:
方案1:通过索引定位拼接整行数据
利用idxmax()/idxmin()获取每个分组中Indicator最值对应的行索引,从原数据提取整行后合并:
import pandas as pd df = pd.read_csv(r'relative.csv') # 提取各分组Indicator最大值对应的整行,添加后缀区分 max_rows = df.loc[df.groupby('Mode')['Indicator'].idxmax()].add_suffix('_max') # 提取各分组Indicator最小值对应的整行,添加后缀区分 min_rows = df.loc[df.groupby('Mode')['Indicator'].idxmin()].add_suffix('_min') # 按Mode合并结果,整理索引 result = pd.merge(max_rows, min_rows, left_on='Mode_max', right_on='Mode_min', how='outer') result = result.set_index('Mode_max').rename_axis('Mode') print(result)
方案2:分组后直接提取最值行
通过groupby().apply()自定义函数,在每个分组内筛选出Indicator最大、最小的行并拼接:
import pandas as pd df = pd.read_csv(r'relative.csv') def extract_min_max(group): # 筛选分组内Indicator最大、最小的行 max_row = group[group['Indicator'] == group['Indicator'].max()] min_row = group[group['Indicator'] == group['Indicator'].min()] # 添加类型标识区分最值 max_row['value_type'] = 'max' min_row['value_type'] = 'min' return pd.concat([max_row, min_row]) # 应用函数并整理结果 result = df.groupby('Mode', group_keys=False).apply(extract_min_max) # 可根据需求重置索引或调整列顺序 print(result)
内容的提问来源于stack exchange,提问作者Chrisyu50d
相关产品推荐
相关产品推荐

