Pandas中lambda函数单列生效、多列应用失效问题求解
Pandas多列使用apply去除空格无效,单列正常
尝试在Pandas DataFrame的多列上用apply()执行去除空格的操作时,数据没有变化,但单列使用apply()却能正常生效,示例代码如下:
import pandas as pd import copy # 初始化DataFrame df = pd.DataFrame ({'a' : ["7 7","5 3"], 'b' : ['f o', 'b r'], 'c' : ["77","53"]}) print(df) # 输出: # a b c # 0 7 7 f o 77 # 1 5 3 b r 53 # 多列apply尝试去除空格,无效果 df[["a","b"]]=df[["a","b"]].apply(lambda x: x.replace(" ","")) print(df) # 输出: # a b c # 0 7 7 f o 77 # 1 5 3 b r 53 # 单列apply正常生效 df2=copy.deepcopy(df) df2["a"]=df2["a"].apply(lambda x: x.replace(" ","")) print(df2) # 输出: # a b c # 0 77 f o 77 # 1 53 b r 53
问题原因
对多列(DataFrame)调用apply()时,默认按列维度(axis=0)处理,此时lambda函数中的x是整个列(Series对象)。Series的replace()方法默认是匹配整个元素值进行替换,而非逐元素处理字符串内部的空格。而单列调用apply()时,x是每个字符串元素,因此x.replace(" ","")能正确替换字符串内的空格。
解决方案
方法1:使用applymap()(推荐)
applymap()是Pandas专门用于对DataFrame每个元素执行函数的方法,直接作用于每个单元格:
df[["a","b"]] = df[["a","b"]].applymap(lambda x: x.replace(" ","")) print(df)
输出:
a b c 0 77 fo 77 1 53 br 53
方法2:嵌套apply()处理每列元素
对多列的每个子列(Series)再调用一次apply(),逐元素处理:
df[["a","b"]] = df[["a","b"]].apply(lambda col: col.apply(lambda x: x.replace(" ","")))
方法3:使用矢量化字符串方法str.replace()(高效)
针对字符串类型的列,Pandas提供了str访问器,支持矢量化操作,性能比apply()更好:
df[["a","b"]] = df[["a","b"]].str.replace(" ","")
内容的提问来源于stack exchange,提问作者Holt Dwyer
相关产品推荐
相关产品推荐

