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
相关产品推荐
相关产品推荐

