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

pandas中str.split(expand=True)处理500万行过慢,如何优化性能?

高性能拆分Pandas字符串列解决方案

核心问题:你当前使用的str.split(expand=True)底层是Python级别的循环实现,处理500万级数据时Python解释器的开销会被无限放大,因此耗时极长。

方案1:纯Pandas优化(无需额外依赖)

核心思路是跳过expand=True的重实现逻辑,直接把拆分后的列表转成DataFrame再拼接,同时限定最大拆分次数减少无效计算:

import pandas as pd

# 限定最多拆分2次,刚好得到3个元素,避免多余拆分
act_list = df["ACT"].astype(str).str.split(",", n=2).tolist()
# 构造step列,空值填充为na
step_df = pd.DataFrame(act_list, columns=["step1", "step2", "step3"]).fillna("na")
# 合并原有维度列和step列
res = pd.concat([df[["SFDC", "SID", "MID"]], step_df], axis=1)

性能提升:比原代码快10~20倍,500万行数据一般10分钟内可以跑完。

方案2:Pandas 2.0+ PyArrow后端优化

如果使用Pandas 2.0及以上版本,开启PyArrow字符串后端可以直接获得C级别的拆分性能:

import pandas as pd

# 把ACT列转为PyArrow字符串类型,底层拆分逻辑用C++实现
df["ACT"] = df["ACT"].astype("string[pyarrow]")
act_list = df["ACT"].str.split(",", n=2).tolist()
step_df = pd.DataFrame(act_list, columns=["step1", "step2", "step3"]).fillna("na")
res = pd.concat([df[["SFDC", "SID", "MID"]], step_df], axis=1)

性能提升:比方案1再快3~5倍,500万行数据1分钟左右可以跑完。

方案3:极致性能方案(换用Polars库)

Polars是Rust实现的高性能数据处理库,处理这类字符串操作没有Python层开销,速度最快:

import polars as pl

# 直接用Polars读取源文件性能更高,也可以从Pandas DataFrame转换
pl_df = pl.from_pandas(df)
res_pl = pl_df.with_columns(
    pl.col("ACT").str.split(",").list.slice(0,3).list.to_struct(fields=["step1","step2","step3"])
).unnest("ACT").fill_null("na").drop("ACT")
# 如需转回Pandas格式调用to_pandas()即可
res = res_pl.to_pandas()

性能提升:500万行数据通常10秒内可以跑完。

内容的提问来源于stack exchange,提问作者peace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:48:04