如何用Python清洗DataFrame列:移除Account Name中匹配Billing Street的内容
Python清洗Excel数据:移除Account Name中匹配Billing Street的子串
需求说明
清洗Excel数据:若Account Name列内容包含对应行Billing Street列的子串,则将Account Name中匹配的部分替换为空;无匹配则保留原值。
错误尝试代码
import pandas as pd import numpy as np import os File= pd.read_excel('Test_data_for_script.xlsx') File1=File.copy() File_1['CLEANSE_NAME']= File_1['Account Name'].str.strip(File_1['Billing Street'])
执行后输出结果为NaN,无法实现预期效果。
问题原因
str.strip()方法仅用于移除字符串首尾的指定字符集合,而非替换任意位置的完整子串;同时pandas的str系列方法是向量化操作,不支持逐行传入不同的匹配值,因此导致结果异常。
正确实现方法
使用apply逐行处理每条数据,针对每行的Account Name和Billing Street进行匹配检查与替换:
方法1:自定义函数处理
import pandas as pd # 读取Excel文件 df = pd.read_excel('Test_data_for_script.xlsx') df_copy = df.copy() def clean_account(row): acc_name = row['Account Name'] bill_street = row['Billing Street'] # 检查子串存在性,存在则替换并去除多余空格,否则返回原内容 if bill_street in acc_name: return acc_name.replace(bill_street, '').strip() return acc_name # 生成清洗后的列 df_copy['CLEANSE_NAME'] = df_copy.apply(clean_account, axis=1) # 可选:保存清洗后的数据 df_copy.to_excel('Cleaned_Test_data.xlsx', index=False)
方法2:Lambda表达式简化写法
import pandas as pd df = pd.read_excel('Test_data_for_script.xlsx') df_copy = df.copy() df_copy['CLEANSE_NAME'] = df_copy.apply( lambda r: r['Account Name'].replace(r['Billing Street'], '').strip() if r['Billing Street'] in r['Account Name'] else r['Account Name'], axis=1 )
说明
两种方法均实现逐行匹配:先判断Billing Street是否是Account Name的子串,若是则替换为空并去除替换后可能产生的多余空格,否则保留原Account Name内容,规避了原代码中str.strip()的使用误区。
内容的提问来源于stack exchange,提问作者Vydeesh
相关产品推荐
相关产品推荐

