如何使用Python高速处理1500万行CSV文件并关联匹配性别字段
问题根因
- 你使用的双重嵌套for循环时间复杂度为O(n*m),1500万行的答题表乘18.7万行的性别表,会产生超2.8万亿次匹配运算,计算量极大。同时纯Python的循环迭代远慢于Pandas底层C语言实现的矢量化运算,是运行超时、会话崩溃的核心原因。
- 循环中对
df.Gender[i]直接赋值属于链式索引操作,会额外产生大量中间副本,进一步加剧内存占用。
高速实现方案
直接使用Pandas内置的merge左连接操作,底层为矢量化实现,1500万行数据匹配仅需几秒到几十秒即可完成,完全不会触发Colab会话崩溃。
优化后完整代码
import pandas as pd # 可选优化:读取数据时指定字段类型,大幅降低内存占用,可根据实际数据类型调整 dtype_answer = {"StudentId": "int32", "Question ID": "int32"} dtype_gender = {"StudentId": "int32", "Gender": "category"} df = pd.read_csv('/content/drive/MyDrive/file1.csv', dtype=dtype_answer) dg = pd.read_csv('/content/drive/MyDrive/file2.csv', dtype=dtype_gender) # 一行代码完成匹配,左连接保留原答题表所有行 df = df.merge(dg, on="StudentId", how="left")
如果需要处理未匹配到性别、Gender为NaN的情况,可在merge后补充填充逻辑:
# 示例:将未匹配的性别填充为"未知" df['Gender'] = df['Gender'].fillna("未知")
可选进阶优化
如果后续需要处理更大体量的数据,还可以使用更轻量化的高性能数据处理库:
- 使用
polars替代Pandas,内存占用更低,运算速度比Pandas快2~5倍 - 使用
dask实现分块处理,无需将全量数据一次性加载到内存
内容的提问来源于stack exchange,提问作者Rahaf Almgheed
相关产品推荐
相关产品推荐

