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

如何使用Pandas的assign方法便捷地对多列执行相同操作?

解决Pandas中用.assign对多列执行相同操作的简洁方案

嘿,我完全懂你的痛点——重复写lambda表达式确实繁琐,还破坏了DRY原则。这里有几个完美适配你需求的方案,既能保持链式调用,又不用写重复代码:

方案1:解包字典推导式(最直接的修正)

你之前尝试的字典推导式思路是对的,只是.assign()需要的是关键字参数,而非单个字典。只要在字典前面加**解包,就能把字典转换成assign需要的格式:

import pandas as pd
df = pd.DataFrame({'a':[' abc ', 'efg', ' hij'], 'b': [' kkk ', 'eee', 'uuu ']})

# 简洁写法,完全支持链式调用
df_clean = df.assign(**{col: lambda x: x[col].str.strip() for col in ['a', 'b']})

这样不用为每一列重复写lambda,后续还能继续链式调用.query()、.groupby()等方法。

方案2:自动识别所有字符串列(更灵活)

如果你的需求是处理DataFrame中所有字符串类型的列,不用手动指定列名,可以先筛选出字符串列再批量处理:

# 自动获取所有字符串类型的列
str_columns = df.select_dtypes(include=['object']).columns

# 批量去除首尾空格
df_clean = df.assign(**{col: lambda x: x[col].str.strip() for col in str_columns})

这种方式在列数较多时特别省心,不用逐个列名去罗列。

方案3:结合apply与to_dict

另一种思路是先用apply对目标列批量处理,再把结果转换成字典传给assign:

df_clean = df.assign(**df[['a', 'b']].apply(lambda s: s.str.strip()).to_dict('series'))

不过这种写法相对第一种稍显冗长,但也是一种可行的替代方案。

为什么你之前的写法会失败?

你之前直接把字典传给assign(),但pd.DataFrame.assign()的参数定义是**kwargs——也就是接收多个形如列名=处理逻辑的关键字参数,而非单个字典对象。用**解包字典,就是把字典的键值对转换成一个个关键字参数,这才符合assign的调用要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:48:15