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

