Python Pandas DataFrame字符串拼接操作内存优化方法咨询
大体积DataFrame轻量化操作方案
1. 多列拼接生成新列
原有+拼接方式处理百万行级以上数据时,会产生大量临时中间对象,内存开销高、执行效率低。推荐使用pandas内置的str.cat()方法实现,同场景下性能提升30%以上,内存占用更低:
df['New_col'] = df['CNPJ'].astype(str).str.cat( [df['UF_DEST'].astype(str), df['MES'].astype(str)], sep='-' )
额外优化点:
- 读取文件时直接指定对应列为字符串类型,避免后续重复做类型转换:
# 读取阶段指定类型 df = pd.read_csv("目标文件路径", dtype={"CNPJ": str, "UF_DEST": str}) # 拼接时仅需对MES列做类型转换 df['New_col'] = df['CNPJ'].str.cat([df['UF_DEST'], df['MES'].astype(str)], sep='-')
- 若数据量超过内存容量,使用分块读取逐段处理:
chunk_res = [] for chunk in pd.read_csv("目标文件路径", chunksize=100000, dtype={"CNPJ": str, "UF_DEST": str}): chunk['New_col'] = chunk['CNPJ'].str.cat([chunk['UF_DEST'], chunk['MES'].astype(str)], sep='-') chunk_res.append(chunk) df = pd.concat(chunk_res, ignore_index=True)
2. 新增固定值新列
你当前使用的写法已经是pandas下最简洁的实现之一,若需要避免链式赋值警告、支持流程化链式调用,可以使用assign()方法实现:
# 该方法不会修改原DataFrame,会返回新增列后的新对象 DIMP_1100 = DIMP_1100.assign(New_Col2='1100')
极致性能优化方案
如果数据规模特别大,想要进一步降低内存开销、提升处理速度,可以替换pandas为polars库,同场景下内存占用仅为pandas的1/31/2,处理速度提升25倍,对应实现方式如下:
import polars as pl # 读取文件 df = pl.read_csv("目标文件路径") # 多列拼接 df = df.with_columns( (pl.col("CNPJ").cast(pl.Utf8) + "-" + pl.col("UF_DEST").cast(pl.Utf8) + "-" + pl.col("MES")).alias("New_col") ) # 新增固定值列 df = df.with_columns(New_Col2=pl.lit("1100"))
内容的提问来源于stack exchange,提问作者Tanai Goncalves
相关产品推荐
相关产品推荐

