pandas创建50列空DataFrame 按指定位置填充5列已有数据
Pandas 按指定位置填充列导出CSV方案
针对数十万行规模的数据集,不要用循环插入列的低效写法,直接按内存块初始化+按位置赋值性能最高,步骤如下:
- 第一步:自定义列位置映射
先明确源DataFrame A的5列要放到50列总宽度里的具体位置,索引从0开始计数,位置取值范围0-49且不能重复,比如匹配示例输出的配置写法:
# key是A的原列名,value是要放置的目标列序号(从0开始) col_position_config = { "id": 1, "first": 2, "last": 3, "type": 12, "order": 0 }
- 第二步:初始化全空的目标DataFrame B
直接生成和A行数一致、共50列的全空DataFrame,用object类型减少类型转换开销,避免逐列插入的性能损耗:
import pandas as pd import numpy as np TOTAL_COLUMNS = 50 # 初始化全空矩阵,行数和A一致 B = pd.DataFrame( data=np.empty((len(A), TOTAL_COLUMNS), dtype=object), columns=range(TOTAL_COLUMNS) )
- 第三步:按配置把A的列填充到B的指定位置
for source_col, target_idx in col_position_config.items(): # 直接取底层numpy数组赋值,比逐元素赋值快几十倍 B.iloc[:, target_idx] = A[source_col].to_numpy()
- 第四步:导出符合要求的CSV
注意参数配置,避免空值显示为nan、多导出索引/表头的问题:
B.to_csv( "result.csv", sep=",", na_rep="", # 空值替换为空字符串 header=False, # 不导出列名,需要表头可以改成True index=False # 不导出行索引 )
导出效果验证:按上面的配置,某行A的数据为id=111、first=Johnny、last=Depp、type=type1、order为空时,导出的行就是
,111,Johnny,Depp,,,,,,,,,type1,,,,,,和给出的示例完全一致。
注意事项
- 配置位置的时候不要出现重复的序号,也不要超出0-49的范围,否则会出现数据覆盖或者下标报错
- 如果需要调整列位置,只需要修改
col_position_config里的对应值即可,不需要改其他代码 - 这种写法对百万行级别的数据也能秒级处理,不会出现内存占用过高或者运行慢的问题
内容的提问来源于stack exchange,提问作者f1data
相关产品推荐
相关产品推荐

