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

Pandas分组后对单列应用自定义函数并保留其余列的实现方案

解决方案:分组应用函数同时保留固定列

这里有两个无需额外合并操作的优化方案,能直接在分组处理时保留你需要的otherstuff1和otherstuff2列:

方案1:使用agg()指定多列处理逻辑

因为你提到每个name对应的otherstuffX列值完全相同,我们可以在分组聚合时,对value1应用自定义函数,对其他列直接取组内任意一个值(比如first、max都可以,结果一致):

import pandas as pd

# 假设你的complex_function已经定义好
def complex_function(values):
    # 示例逻辑,替换成你的实际代码
    return sum(values) * 30.7

result = df.groupby('name', sort=False).agg(
    value1=('value1', complex_function),
    otherstuff1=('otherstuff1', 'first'),
    otherstuff2=('otherstuff2', 'first')
).reset_index()

这个方法代码清晰,明确指定每一列的处理规则,执行效率也较高。

方案2:对整个分组应用自定义处理函数

如果你的otherstuff列数量很多,不想逐个列名指定,可以编写一个处理整个分组的函数,返回包含所有需要列的Series:

def process_single_group(group):
    # 处理value1列
    processed_value = complex_function(group['value1'])
    # 取组内第一行的otherstuff值(因为组内所有行的值都相同)
    return pd.Series({
        'value1': processed_value,
        'otherstuff1': group['otherstuff1'].iloc[0],
        'otherstuff2': group['otherstuff2'].iloc[0]
    })

result = df.groupby('name', sort=False).apply(process_single_group).reset_index()

这种方式更灵活,适合列数较多的场景,只需要一次函数定义就能处理所有列。

为什么原代码会丢失列?

你之前的代码df.groupby('name', sort=False)['value1'].apply(complex_function).reset_index()只针对value1列进行分组处理,所以返回的结果只包含name和处理后的value1。而上面的两种方法都是对整个分组或多列进行操作,因此能直接保留需要的所有列。

内容的提问来源于stack exchange,提问作者Mrofsnart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:09:08