如何在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
原有两个单独的清洗函数可正常工作,但合并后代码未生效。
错误原因分析
你的合并代码存在两个关键问题:
- 列索引写法错误:
df['Date of Publication', 'Place of Publication']会创建一个以元组为名称的新单列,而非修改两个现有列,需用双层方括号df[['列1', '列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
相关产品推荐
相关产品推荐

