如何在Pandas DataFrame中提取列部分内容生成新列并解决报错
解决Pandas提取字符串前2字符生成新列的问题
嘿,我来帮你搞定这个问题!你的需求是从列a里提取前2个字符作为新列d,但之前的代码写法出了问题,咱们一步步来解决。
先说说你代码出错的原因
你遇到的错误:
TypeError: ("split() missing 1 required positional argument: 'self'", 'occurred at index 0')
这个错误主要有两个原因:
- 你错误地直接调用
pd.Series.str.split——这个方法是要在具体的Series对象上使用的,不能直接这么调用,而且你还写错了DataFrame的名字(df1t应该是df1吧?); - 更关键的是,
split是用来分割字符串的工具,根本不是用来提取前N个字符的,用它完全搞错方向啦。
给你几个简单高效的正确方法
Pandas里处理这种字符串提取,尽量别用apply逐行处理,向量化操作才是最优解,速度快还简洁:
方法1:直接用字符串切片(最推荐)
如果你的列a已经是字符串类型,直接用str[:2]就能提取每个元素的前2个字符:
df1['d'] = df1['a'].str[:2]
方法2:如果列a是数值类型(比如整数)
如果a列存的是整数,那得先转成字符串再切片,不然像0987这种带前导零的数值会被当成987,提取前两位就错了:
df1['d'] = df1['a'].astype(str).str[:2]
方法3:非要用apply的正确写法(不推荐)
如果你坚持想用apply,那得在lambda里正确处理每一行的a值:
df1['d'] = df1.apply(lambda row: str(row['a'])[:2], axis=1)
但还是那句话,这种逐行处理的方式性能远不如前两种向量化操作,能不用就不用。
运行后的结果
用上面的正确代码处理后,你的DataFrame就会变成你想要的样子:
a b c d 0 1234 4567 7890 12 1 0987 7654 4321 09 2 0708 7080 9080 07
内容的提问来源于stack exchange,提问作者Clayton Tosatti
相关产品推荐
相关产品推荐

