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

如何让Pandas的.apply函数识别raw=True为自身参数而非目标函数参数?

问题: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),从而触发参数错误。

针对你的需求,有两种处理方式:

  1. 改用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,匹配原列的格式。

  2. 直接使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:33:43