1500万行Pandas DataFrame高效处理:替换指定值与生成组合ID
处理1500万行Pandas DataFrame的高效方案
需求
处理包含1500万行的大型DataFrame:
- 将所有以
College开头的college_name字段值替换为空值 - 创建
combined id列,仅当学院名称有效时,将学生姓名与学院名称组合;学院无效时该列为空
原始数据
id1 id2 college_name student combined id 0 01 01 Stanford haley id/haley_Stanford 1 01 02 College12 josh id/josh_College12 2 01 03 Harvard jake id/jake_Harvard 2 01 05 UPenn emily id/emily_UPenn 2 01 00 College10 sarah id/sarah_College10
期望结果
id1 id2 college_name student combined id 0 01 01 Stanford haley id/haley_Stanford 1 01 02 josh 2 01 03 Harvard jake id/jake_Harvard 2 01 05 UPenn emily id/emily_UPenn 2 01 00 sarah
高效实现方案
直接用Pandas的矢量化字符串操作,完全避免循环,利用底层C扩展的优化,是处理大数据集最快的方式:
import pandas as pd import numpy as np # 1. 标记无效学院(以College开头) invalid_college = df['college_name'].str.startswith('College', na=False) # 2. 替换无效学院名称为空值 df.loc[invalid_college, 'college_name'] = '' # 3. 生成combined id列:仅学院有效时组合,否则为空 df['combined id'] = np.where( ~invalid_college, 'id/' + df['student'] + '_' + df['college_name'], '' )
为什么这个方案最快?
- 所有操作都是矢量化的,没有逐行循环,Pandas会把这些操作推送到底层C语言执行,比Python循环快几个数量级
str.startswith是Pandas专门优化的字符串方法,处理百万级数据效率远高于自定义循环np.where和loc都是批量操作,避免了逐行判断的开销
额外优化建议
如果内存紧张,可以考虑:
- 将
college_name和student列设置为category类型(如果重复值较多),减少内存占用 - 分块处理数据(用
df.read_csv(chunksize=...)),避免一次性加载全部数据到内存
内容的提问来源于stack exchange,提问作者youtube
相关产品推荐
相关产品推荐

