Pandas拼接多CSV文件时sn3仅保留最后一份数据的问题排查
问题定位
sn3最终只保留最后一个文件数据的核心原因是 循环内sn3的赋值逻辑完全没有做数据累积,每次循环都会直接用当前文件筛选出的temp2覆盖sn3变量,之前循环读入的所有数据都会被丢弃。
你代码里sn3的处理行:
sn3=pd.concat([temp2])
这行的执行效果和sn3 = temp2完全等价——pd.concat只接收了当前循环的temp2作为唯一输入,没有把之前已经存到sn3里的历史数据放进去拼接,和sn2的sn2=sn2.append(temp1)累积逻辑完全不一致,循环跑完自然只剩最后一个文件的内容。
修复方法
两种写法都可以,和sn2的累积逻辑对齐即可:
- 写法1:和现有sn2逻辑一致,用append追加
sn3 = sn3.append(temp2)
- 写法2:用官方推荐的concat写法
sn3 = pd.concat([sn3, temp2])
注意:pandas 1.4及以上版本
DataFrame.append()方法已被官方标记为废弃,后续版本会直接移除,统一使用pd.concat()即可。
额外优化建议
循环里逐次拼接DataFrame的效率很低,每次拼接都会生成新的DataFrame、复制全量数据,文件多的时候速度会很慢。更优的写法是先把所有待拼接的片段存到列表里,循环结束后一次性合并:
import pandas as pd import os sn2_fragments = [] sn3_fragments = [] files = os.listdir(load_path) for file in files: # 用os.path.join拼接路径,避免手动拼字符串漏斜杠的跨系统兼容问题 df_temp = pd.read_csv(os.path.join(load_path, file)) df_temp['Date'] = file.split('.')[0] df_temp['Date'] = pd.to_datetime(df_temp['Date'], format='%Y%m%d%H%M') # 筛选Atribute1对应数据存入sn2片段列表 sn2_fragments.append(df_temp[df_temp['Name'] == 'Atribute1']) # 筛选Atribute2对应数据存入sn3片段列表 sn3_fragments.append(df_temp[df_temp['Name'] == 'Atribute2']) # 一次性合并所有片段,ignore_index=True可以重置索引避免索引重复 sn2 = pd.concat(sn2_fragments, ignore_index=True) sn3 = pd.concat(sn3_fragments, ignore_index=True)
内容的提问来源于stack exchange,提问作者efndzp7
相关产品推荐
相关产品推荐

