使用Python按两列过滤CSV文件:解决SiteID与Location不匹配问题
Pandas CSV数据清洗问题排查与实现
现有代码问题
- 变量名冲突:导入pandas时设置别名为
pd,后续又将读取的DataFrame赋值给pd,覆盖了pandas库的别名,会导致后续调用pandas方法报错,建议将DataFrame命名为df这类常规变量名。 - 变量未定义:使用
pandas.read_csv调用方法,你已经给pandas设置了别名pd,直接使用pd.read_csv即可,不需要写pandas全称。 where方法逻辑错误:pd.where的作用是满足条件时保留原值,不满足条件时填充指定值,你当前的写法完全无法实现SiteID和Location的匹配校验需求。- 未覆盖核心需求:没有做空值校验、异常行打印、异常数据剔除的逻辑。
完整可用代码
import pandas as pd # 读取CSV文件,百万级数据可添加dtype参数指定字段类型降低内存占用 df = pd.read_csv('car-auction-data-from-ghana', delimiter=';') # 按需求过滤2010年及之后的记录 df = df[df['Date Time'] >= '2010-01-01T00:00:00+00:00'].reset_index(drop=True) # 定义异常条件:SiteID为空 / Location为空 / 二者取值不匹配 abnormal_mask = df['SiteID'].isna() | df['Location'].isna() | (df['SiteID'] != df['Location']) abnormal_records = df[abnormal_mask] # 打印异常记录:行号为数据行号(第一行数据行号为1,不含表头),需要含表头的行号则改为 idx+2 print(f"共发现{len(abnormal_records)}条异常记录:") for idx, row in abnormal_records.iterrows(): print(f"行号{idx+1} | SiteID值:{row['SiteID']} | Location值:{row['Location']}") # 剔除异常记录,保留正常数据 clean_df = df[~abnormal_mask] # 导出清洗后的数据到新文件,不要覆盖原始文件 clean_df.to_csv('cleaned_car_auction_data.csv', sep=';', index=False)
注意事项
- 如果SiteID和Location是映射对应关系而非直接相等,需要先基于确认正确的匹配关系生成映射字典,再校验二者是否匹配,不要直接用
==判断。 - 若两个字段数据类型不同(比如一个是整数、一个是字符串),会出现判等误判,建议校验前统一转为字符串类型,将判等条件改为
df['SiteID'].astype(str) != df['Location'].astype(str)即可。 - 内存不足时可以在
read_csv中添加chunksize=100000参数分块读取处理,进一步降低内存占用。
内容的提问来源于stack exchange,提问作者Eugene Gyimah
相关产品推荐
相关产品推荐

