Pandas基于列内容拼接两个CSV并筛选符合价差条件行的方法
Pandas 实现通用方案
整个流程基于pandas实现,针对大型CSV做了性能优化,步骤如下:
- 第一步:导入依赖、读取并清洗数据
读取文件时优先只加载需要的列节省内存,同时强制把价格列转为数值类型,避免前导零、字符串格式数字导致的计算错误。import pandas as pd # 读取文件,大文件场景下用usecols指定只加载需要的列,大幅降低内存占用 df1 = pd.read_csv("第一个CSV文件路径.csv") df2 = pd.read_csv("第二个CSV文件路径.csv", usecols=["Unit", "Price"]) # 价格列转数值,遇到脏数据自动转空值,避免计算报错 df2["Price"] = pd.to_numeric(df2["Price"], errors="coerce") - 第二步:匹配价格生成df3
用哈希映射的方式匹配价格,比多表联查性能高很多,适合大表场景。注意实际存储时不建议使用重复列名,会导致后续列操作报错,所以先给价格列加区分后缀,最终输出时再调整列名对齐示例即可。# 构建商品名到价格的映射字典,查找时间复杂度O(1) price_lookup = df2.set_index("Unit")["Price"] # 为水果、蔬菜分别匹配对应价格 df3 = df1.copy() df3["Fruit_Price"] = df3["Fruit"].map(price_lookup) df3["Veg_Price"] = df3["Vegetable"].map(price_lookup) # 可选:删除匹配不到价格的无效行 df3 = df3.dropna(subset=["Fruit_Price", "Veg_Price"]).reset_index(drop=True) - 第三步:按价差规则筛选生成df4
计算同一行两类商品的价格差绝对值,筛选差值在5美元以内的行即可。# 筛选价差≤5的行 df4 = df3[abs(df3["Fruit_Price"] - df3["Veg_Price"]) <= 5].reset_index(drop=True) # 调整列顺序对齐示例结构,再重命名为目标列名 df3 = df3[["Index", "Fruit", "Fruit_Price", "Vegetable", "Veg_Price"]] df4 = df4[["Index", "Fruit", "Fruit_Price", "Vegetable", "Veg_Price"]] df3.columns = ["Index", "Fruit", "Price", "Vegetable", "Price"] df4.columns = ["Index", "Fruit", "Price", "Vegetable", "Price"]
大文件额外优化提示
- 如果单文件大小超过内存容量,可以将df2的价格映射提前存为字典,df1用分块读取(
pd.read_csv(..., chunksize=100000))的方式逐块处理、逐块匹配、逐块筛选,最后把所有块的结果拼接就行,不会出现内存溢出问题 - 不要用两次merge的方式匹配价格,映射查找的方式在千万级数据量下速度要快数倍
- 读取CSV时可以提前指定
dtype参数给列设置合适的数据类型(比如字符串列用category类型),进一步压缩内存占用
内容的提问来源于stack exchange,提问作者S_Scouse
相关产品推荐
相关产品推荐

