You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:28:44