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

如何对Pandas DataFrame指定列应用函数并保留其余列?

问题描述

假设我们有如下Pandas DataFrame:

import pandas as pd
df = pd.DataFrame({
    'Name': ['foo', 'bar', 'baz'],
    'Value': [1, 2, 3],
    'Duration': ['1s', '2s', '3s'],
})

希望转换Name和Value列,但保留Duration列不变。想要找到类似pd.DataFrame.apply或pd.DataFrame.transform的方法,能对指定列应用函数且自动保留其余列,理想用法如下:

df = df.some_method({
  'Name': lambda name: name.upper(),
  'Value': lambda value: value + 1
})

目前已知的实现方式需要重复列名,处理10+列时操作繁琐:

df[['Name', 'Value']] = df.apply({
  'Name': lambda name: name.upper(),
  'Value': lambda value: value + 1
}, axis='columns')
解决方案

方法1:使用DataFrame.assign()

这是最贴合需求的方案,无需重复列名,直接对指定列应用转换,同时自动保留其他列:

df = df.assign(
    Name=df['Name'].str.upper(),
    Value=df['Value'] + 1
)

如果想用字典批量管理列与转换函数的对应关系,可以将字典解包传入assign:

transform_funcs = {
    'Name': lambda s: s.str.upper(),
    'Value': lambda s: s + 1
}
df = df.assign(**transform_funcs)

这种方式完全匹配你想要的用法逻辑,处理多列时只需扩展字典即可,无需重复列名。

方法2:使用DataFrame.update()结合列级apply

先对需要转换的列生成临时DataFrame,再用update更新原DataFrame:

transform_funcs = {
    'Name': lambda name: name.upper(),
    'Value': lambda value: value + 1
}
temp_df = df[transform_funcs.keys()].apply(transform_funcs)
df.update(temp_df)

注意update会原地修改原DataFrame,若需保留原始数据,记得先复制:df_copy = df.copy(); df_copy.update(temp_df)。

方法3:自定义封装方法

如果需要频繁进行这类操作,可以自己封装一个符合理想用法的方法:

def apply_cols(df, func_map):
    return df.assign(**{col: func(df[col]) for col, func in func_map.items()})

# 使用示例
df = apply_cols(df, {
    'Name': lambda s: s.str.upper(),
    'Value': lambda s: s + 1
})

这样就实现了你想要的some_method式调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:07:28