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

Pandas分组后新增列:获取分组内col3的最大值与第二大值

解决分组后获取最大值与第二大值并新增列的问题

我来帮你搞定这个需求!其实用Pandas的分组和聚合功能就能轻松实现,下面给你两种常用的方案,你可以根据自己的数据情况选择:

方案一:使用nlargest快速获取前两大值(推荐)

这个方法简洁直观,还能自动处理组内元素不足2个的情况(会用NaN填充第二大值):

步骤说明:

  1. 按col1和col2分组后,对col3取每组前2大的值
  2. 把结果转置成列,并重命名为你需要的col3_max(最大值)和col4(第二大值)
  3. 将分组结果合并回原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:17:48