Pandas用apply生成拼接列过慢,求2亿行数据的高效实现方法
高性能实现2亿行DataFrame的字符串拼接方案
针对你2亿行数据的场景,绝对要避开apply或者逐行循环——这些Python层面的迭代在大数据量下会慢到让人崩溃,必须用基于C实现的向量化操作才能搞定。下面是几种从快到优的方案,以及内存优化技巧:
1. 最优方案:Pandas向量化字符串直接拼接
这是速度最快的方式,完全利用Pandas的内部向量化机制,没有Python循环开销:
import pandas as pd # 先确保列是数值类型(如果原始数据格式有问题的话) df[['os', 'hour', 'day']] = df[['os', 'hour', 'day']].apply(pd.to_numeric, errors='coerce') # 直接拼接生成新列 df['new_col'] = df['os'].astype(str) + '_' + df['hour'].astype(str) + '_' + df['day'].astype(str)
Pandas的字符串加法是向量化的,所有操作在C层完成,处理2亿行的速度会比apply快几十倍甚至上百倍。
2. 备选方案:Numpy字符数组拼接
如果想进一步压榨性能,可以用Numpy的字符操作函数,它的底层实现同样高效:
import numpy as np # 把列转成Numpy字符串数组 os_str = df['os'].values.astype(str) hour_str = df['hour'].values.astype(str) day_str = df['day'].values.astype(str) # 用np.char.join一次性完成多元素拼接 df['new_col'] = np.char.join('_', [os_str, hour_str, day_str])
这个方法和Pandas直接拼接速度接近,有时候在极端大内存场景下表现更稳定。
3. 内存优化技巧(关键!)
2亿行数据的内存占用是核心瓶颈,先优化原列的数据类型能大幅降低内存开销,让后续操作更快:
- 观察
os、hour、day的数值范围:比如hour是0-23,day是0-31,os如果是0-255以内的整数,都可以转成uint8类型(只占1字节/元素)
# 转换为最小可行的整数类型 df['os'] = df['os'].astype('uint8') df['hour'] = df['hour'].astype('uint8') df['day'] = df['day'].astype('uint8')
这一步能把原三列的内存占用降到原来的1/8(如果之前是int64的话),后续转字符串和拼接的速度会明显提升。
避坑提醒
- 绝对不要用
df.apply(lambda x: f"{x['os']}_{x['hour']}_{x['day']}", axis=1):这种逐行调用Python函数的方式,2亿行数据可能要跑几个小时,完全不可行。 - 也不要用
iterrows()/itertuples()循环:本质还是Python层面的迭代,速度和apply差不多慢。
内容的提问来源于stack exchange,提问作者yanachen
相关产品推荐
相关产品推荐

