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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:03