Python中不使用append循环拼接DataFrame的方法及代码优化咨询
解决方案:直接收集DataFrame后一次性拼接
嘿,我完全懂你碰到的问题——用append存numpy数组确实很容易搞乱数据结构,尤其是当你处理后的各个DataFrame列结构有差异的时候。别绕弯子存数组了,直接收集DataFrame然后一次性拼接才是稳妥的办法!
具体步骤:
- 初始化一个空列表,用来存放处理后的完整DataFrame(而不是转成numpy数组)
- 循环处理每个文件时,把处理好的DataFrame直接加入列表
- 循环结束后,用
pd.concat()一次性拼接所有DataFrame,这比循环内逐次拼接性能更好,也能保留DataFrame的元数据(列名、索引等)
修正后的代码:
import pandas as pd import os # 初始化空列表,用于存储处理后的DataFrame df_collection = [] for file in folder: df = pd.read_csv(file, header=None) # --- 这里放你的数据处理逻辑,比如清洗、转换等 --- # ... 你的自定义处理代码 ... merged = df # 假设处理后得到该DataFrame,请根据实际逻辑调整变量名 # 保留你原有需求:保存单个处理后的文件 merged.to_csv(f'2017_{Time}_min_{os.path.basename(file)}_merged.csv') # 将处理好的DataFrame直接加入列表,无需转成numpy数组 df_collection.append(merged) # 一次性拼接所有DataFrame,ignore_index=True重置合并后的索引 final_merged_df = pd.concat(df_collection, ignore_index=True) # 查看合并结果的前5行 print(final_merged_df.head(5))
为什么这个方法更好?
- 避免numpy结构丢失问题:直接操作DataFrame不会像转成numpy数组那样丢失列名、数据类型等关键元数据
- 性能更优:
pd.concat()是批量处理,比循环内逐次使用df.append()(每次都会创建新对象)高效得多 - 自动列对齐:如果不同文件的DataFrame列名/列数有差异,
concat会自动对齐列并补NaN;你也可以通过join='inner'参数只保留所有文件共有的列
内容的提问来源于stack exchange,提问作者Giladbi
相关产品推荐
相关产品推荐

