如何让Pandas的.apply函数识别raw=True为自身参数而非目标函数参数?
你尝试使用《High Performance Python》(Gorelick和Ozsvald著)第155页提到的pandas.apply的raw=True选项,但Python将该参数视为被应用函数的参数而非.apply自身的参数,执行代码时报错。
最小复现示例:
import pandas as pd df = pd.DataFrame(columns=('a', 'b')) df.loc[0] = (1, 2) df.loc[1] = (3, 4) df['a'] = df['a'].apply(str, raw=True)
报错信息:
TypeError: 'raw' is an invalid keyword argument for str()
使用lambda或自定义函数时问题依然存在。
核心原因:raw=True是DataFrame.apply()的专属参数,Series.apply()并不支持该参数。你调用的df['a'].apply()是Series对象的方法,Python会把未被Series.apply识别的raw=True传递给目标函数(如str),从而触发参数错误。
针对你的需求,有两种处理方式:
改用DataFrame调用apply(使用双括号选中列,返回DataFrame)
如果需要利用raw=True的性能优势,需对DataFrame而非Series调用apply,之后再将结果转回Series:import pandas as pd df = pd.DataFrame(columns=('a', 'b')) df.loc[0] = (1, 2) df.loc[1] = (3, 4) # 对单列DataFrame调用apply,raw=True生效 df['a'] = df[['a']].apply(str, raw=True).squeeze().squeeze()用于将单列DataFrame转换为Series,匹配原列的格式。直接使用Series.apply(无需raw参数)
对于Series的元素处理,raw=True没有意义——因为Series.apply默认每次传递单个元素给目标函数,不需要额外指定raw。直接去掉该参数即可正常运行:df['a'] = df['a'].apply(str)
补充说明:《High Performance Python》中提到的raw=True场景,是针对DataFrame批量处理行/列数据的情况,此时raw=True会传递numpy数组而非Pandas对象,减少开销提升性能;但Series的处理逻辑本身就是单元素传递,因此没有提供该参数。
内容的提问来源于stack exchange,提问作者Adrian Keister

