Pandas分组后新增列:获取分组内col3的最大值与第二大值
解决分组后获取最大值与第二大值并新增列的问题
我来帮你搞定这个需求!其实用Pandas的分组和聚合功能就能轻松实现,下面给你两种常用的方案,你可以根据自己的数据情况选择:
方案一:使用nlargest快速获取前两大值(推荐)
这个方法简洁直观,还能自动处理组内元素不足2个的情况(会用NaN填充第二大值):
步骤说明:
- 按
col1和col2分组后,对col3取每组前2大的值 - 把结果转置成列,并重命名为你需要的
col3_max(最大值)和col4(第二大值) - 将分组结果合并回原DataFrame,让每一行都对应到所在组的最大和第二大值
示例代码:
import pandas as pd # 先构造一个示例DataFrame(你可以替换成自己的数据) df = pd.DataFrame({ 'col1': ['A', 'A', 'A', 'B', 'B', 'B'], 'col2': ['X', 'X', 'Y', 'X', 'Y', 'Y'], 'col3': [10, 20, 30, 40, 50, 60] }) # 获取每组前两大值并整理成列 top_two_vals = df.groupby(['col1', 'col2'])['col3'].nlargest(2).unstack() top_two_vals.columns = ['col3_max', 'col4'] # 重命名列 top_two_vals = top_two_vals.reset_index() # 合并回原DataFrame final_df = df.merge(top_two_vals, on=['col1', 'col2'])
运行后final_df的输出就是你要的目标结果啦!
方案二:自定义聚合函数(灵活处理重复值)
如果你的col3有重复值,并且希望第二大值是去重后的次大值,可以用自定义函数来实现:
示例代码:
def extract_max_and_second(series): # 先排序去重,从大到小排列 sorted_unique = series.sort_values(ascending=False).unique() max_val = sorted_unique[0] if len(sorted_unique) >= 1 else None # 只有当去重后至少有2个值时才取第二大,否则返回NaN second_max_val = sorted_unique[1] if len(sorted_unique) >= 2 else pd.NA return pd.Series([max_val, second_max_val], index=['col3_max', 'col4']) # 分组聚合 grouped_result = df.groupby(['col1', 'col2'])['col3'].apply(extract_max_and_second).reset_index() # 合并回原DataFrame final_df = df.merge(grouped_result, on=['col1', 'col2'])
比如如果某组的col3是[20,20,10],这个方案会返回第二大值为10,而方案一返回的是20,你可以根据业务需求选择。
内容的提问来源于stack exchange,提问作者hmaxx
相关产品推荐
相关产品推荐

