Python优化CSV列比对及向指定行追加内容的方案探讨
优化CSV匹配拼接脚本的方案
你的需求是将CSV1中匹配ID的值拼接后追加到CSV2对应行,用pandas可以完美解决这个问题,同时大幅提升性能、精简代码,还能避免手动处理CSV的各种坑(比如单元格含逗号的情况)。
原代码的问题点
- 重复读取CSV1,额外消耗IO资源
- 用列表存储数据,
in判断、count、index查找的时间复杂度高,数据量大时会明显变慢 - 手动拆分CSV行,无法处理单元格包含逗号(被引号包裹)的合法场景
基于pandas的优化实现
import pandas as pd # 读取CSV文件,header=None表示文件无表头,按列索引操作 df1 = pd.read_csv('csv1.csv', encoding='utf8', header=None) df2 = pd.read_csv('csv2.csv', encoding='utf8', header=None) # 对df1按匹配列(第0列)分组,将待追加的列(第2列)用" + "拼接 merged_df1 = df1.groupby(0, as_index=False)[2].agg(' + '.join) # 将df2和处理后的df1合并,按df2的匹配列(第1列)与df1的第0列关联 # how='left'保留df2的所有行,匹配不到的用NaN填充 result = pd.merge(df2, merged_df1, left_on=1, right_on=0, how='left') # 将未匹配的行填充为"not found" result[2] = result[2].fillna('not found') # 合并原df2的行和拼接结果,生成最终数据 final_result = pd.concat([df2, result[2]], axis=1) # 保存结果到out.csv,不保留pandas自动生成的索引 final_result.to_csv('out.csv', encoding='utf8', index=False, header=False)
代码说明
- 分组拼接:用
groupby+agg(' + '.join)直接完成同ID下值的拼接,比手动循环高效得多 - 合并操作:
pd.merge的left连接保证CSV2的所有行都被保留,完全符合你的需求 - 鲁棒性:pandas原生处理CSV的各种格式问题,不用再担心手动拆分出错
- 性能:pandas基于numpy实现,处理大数据量时比纯Python循环快几个数量级
如果你的CSV有表头,只需要去掉header=None,并把代码中的列索引(0、1、2)换成对应的列名即可。
内容的提问来源于stack exchange,提问作者Varqas
相关产品推荐
相关产品推荐

