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

如何在Python Pandas中用if语句合并两个函数处理两列数据?

正确合并数据清洗函数的方法

你遇到的问题是合并后的函数未修改目标列,核心原因是pandas多列赋值方式错误,且未正确展开apply返回的元组结果。

问题场景回顾

你正在清洗Place of Publication列,部分值同时包含出版地和日期信息,例如:

  • pp. 40. G. Bryan & Co: Oxford, 1898
  • pp. 40. W. Cann: Plymouth, 1876
  • pp. vi. 216. Hatchards: London, 1888

原有两个单独的清洗函数可正常工作,但合并后代码未生效。

错误原因分析

你的合并代码存在两个关键问题:

  1. 列索引写法错误:df['Date of Publication', 'Place of Publication'] 会创建一个以元组为名称的新单列,而非修改两个现有列,需用双层方括号df[['列1', '列2']]指定多列。
  2. 未展开元组结果:apply返回的元组默认会被包装成Series的元素,需要指定result_type='expand'参数,让元组直接展开为多列数据。

正确的合并代码

def clean_both(item):
    pop = str(item.loc['Place of Publication'])
    dop = str(item.loc['Date of Publication'])

    # 用startswith更直观判断前缀
    if pop.startswith('pp.'):
        comma_idx = pop.find(',')
        colon_idx = pop.find(':')
        # 提取日期和出版地
        dop = pop[comma_idx + 2:]
        pop = pop[colon_idx + 2:comma_idx]
    
    return dop, pop

# 关键:双层方括号指定目标列,加上result_type='expand'展开元组
df[['Date of Publication', 'Place of Publication']] = df.apply(clean_both, axis=1, result_type='expand')

额外优化建议

  • 用str.startswith('pp.')替代切片判断,代码可读性更强。
  • 可添加异常处理(比如找不到逗号/冒号的情况)避免索引报错,示例:
    if pop.startswith('pp.'):
        comma_idx = pop.find(',')
        colon_idx = pop.find(':')
        # 确保找到索引再处理
        if comma_idx != -1 and colon_idx != -1:
            dop = pop[comma_idx + 2:]
            pop = pop[colon_idx + 2:comma_idx]
    

内容的提问来源于stack exchange,提问作者Kristen Williams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:40:21