如何对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
相关产品推荐
相关产品推荐

