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

Pandas能否一次性完成多列转换?R data.table用户求教

更简洁的Pandas多列操作实现方案

嘿,完全懂你想要像R data.table那样用紧凑语句完成多列操作的需求!Pandas里确实有几种简洁的方式,不用拆分成多行代码,下面给你两个实用方案:

方案1:使用assign()链式调用(最推荐)

assign()方法可以让你在一个链式操作里完成列修改和新列创建,而且支持引用前面刚处理好的列,完美匹配你的需求:

import pandas as pd

ex_df = (pd.DataFrame(data={"a": [1,2,3,4], "b": ["a-b", "c-d", "e-f", "g-h"]})
         .assign(
             # 先修改b列,去掉"-"
             b=lambda df: df["b"].str.replace("-", ""),
             # 基于修改后的b列创建c列(取首字母)
             c=lambda df: df["b"].str[0],
             # 拼接c列和转成字符串的a列得到d列
             d=lambda df: df["c"] + df["a"].astype(str)
         ))

print(ex_df)

输出结果和你预期的完全一致:

a   b  c   d
0  1  ab  a  a1
1  2  cd  c  c2
2  3  ef  e  e3
3  4  gh  g  g4

这里用str.replace()替代了原来的map(lambda x: "".join(x.split("-"))),是更符合Pandas风格的向量化操作,效率也更高;而且链式结构让所有操作逻辑一目了然,和data.table的单语句风格异曲同工。

方案2:原地操作的紧凑写法(适合不想创建副本的场景)

如果你想直接在原DataFrame上操作,也可以把多个操作压缩到更紧凑的形式(虽然不如链式写法可读性强,但能减少行数):

import pandas as pd

ex_df = pd.DataFrame(data={"a": [1,2,3,4], "b": ["a-b", "c-d", "e-f", "g-h"]})
ex_df["b"], ex_df["c"], ex_df["d"] = (ex_df["b"].str.replace("-", ""),
                                      ex_df["b"].str.replace("-", "").str[0],
                                      ex_df["b"].str.replace("-", "").str[0] + ex_df["a"].astype(str))

不过这个方案需要重复调用str.replace(),如果列操作复杂的话可读性会下降,所以更推荐第一种链式assign的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:38