如何用循环将DataFrame追加至空DataFrame?循环读取CSV数据异常排查
循环合并CSV到DataFrame只保留最后一个文件?问题分析与解决方法
嘿,我看你遇到的问题很典型——循环处理CSV文件合并到DataFrame时,最后只剩最后一个文件的数据,咱们来一步步拆解问题出在哪,再给你搞定正确的写法~
你的代码问题出在哪?
咱们先看你代码里的几个关键错误:
- 空DataFrame初始化放在循环内:你把
newDF = pd.DataFrame(columns=columns_name)写在了for循环里面,这意味着每处理一个CSV文件,都会把newDF重新重置为空表,之前合并的数据直接被覆盖了!这就是为什么最后只剩最后一个文件的数据。 - 缺少CSV读取逻辑:你代码里的
df没有来源呀?应该是要先读取当前循环的csv_file,比如df = pd.read_csv(csv_file),不然df根本没有数据可以合并。
正确的循环合并写法
我给你两种可行的写法,第二种更推荐(效率更高):
方法1:循环外初始化空DF,逐次追加(适合小文件场景)
import pandas as pd import glob path = "你的目标文件夹路径" csv_files = glob.glob(path + "/*.csv") columns_name = ['A', 'B', 'C', 'D'] # 注意这里要加引号,不然会被当成未定义变量 # 关键!把空DataFrame的初始化放在循环外面 newDF = pd.DataFrame(columns=columns_name) for csv_file in csv_files: # 第一步:读取当前CSV文件的数据 df = pd.read_csv(csv_file) # 只保留我们需要的列(避免引入多余列) df = df[columns_name] # 追加到newDF,ignore_index=True重置索引避免重复 newDF = pd.concat([newDF, df], ignore_index=True) # 填充空值 newDF.fillna('unknown', inplace=True)
方法2:先收集所有DF到列表,最后一次性合并(推荐,大文件/多文件场景)
多次调用pd.concat会创建多个临时DataFrame,效率较低。更优的方式是先把所有CSV的DataFrame收集到列表里,最后一次性合并:
import pandas as pd import glob path = "你的目标文件夹路径" csv_files = glob.glob(path + "/*.csv") columns_name = ['A', 'B', 'C', 'D'] # 创建空列表存储每个CSV的DataFrame df_collection = [] for csv_file in csv_files: df = pd.read_csv(csv_file) df = df[columns_name] df_collection.append(df) # 一次性合并所有DataFrame newDF = pd.concat(df_collection, ignore_index=True) newDF.fillna('unknown', inplace=True)
关键注意点
- 初始化位置:空DataFrame或列表一定要放在循环外面,避免每次循环重置数据
- 索引重置:
ignore_index=True必须加,不然合并后的索引会重复,后续筛选、排序容易出问题 - 列过滤:提前指定并过滤需要的列,避免引入CSV中多余的列导致合并失败
内容的提问来源于stack exchange,提问作者KinWolf
相关产品推荐
相关产品推荐

