Python使用pandas合并多文件列时出现NaN值的处理方法咨询
问题原因说明
出现大量NaN的核心原因是不同输入文件的t列(时间序列)的取值不完全一致。你设置了t为行索引后用pd.concat横向拼接时,默认采用外连接逻辑,只要某个时间值没有在某个文件中出现,对应位置就会填充NaN。
你不需要改用combine类函数,pd.concat本身就可以满足你的需求,只需要调整参数或补充缺失值处理逻辑即可,combine主要适用于两个DataFrame按自定义规则合并的场景,不适合当前多文件批量拼接的场景。
适配不同需求的解决方案
方案1:仅保留所有文件共有的时间点,输出无空值
只需要给pd.concat添加join='inner'参数,采用内连接逻辑,仅保留所有文件都存在的时间索引行,最终结果不会出现NaN。
同时你原代码中列名重命名的逻辑存在小问题:os.path.basename('X_ch2_'+f)会先拼接前缀再取文件名,导致前缀丢失,应该调整为先取文件名再加前缀。
修改后的完整代码如下:import glob import pandas as pd import os file_extension = 'Cam_Cantera_IDT_output_800K_*.csv' all_filenames = [i for i in glob.glob(f"*{file_extension}")] require_cols = ['t', 'X_ch2'] # 修正列重命名逻辑 L = [pd.read_csv(f, usecols = require_cols, index_col=['t'])['X_ch2'].rename('X_ch2_'+os.path.basename(f)) for f in all_filenames] # 加join='inner'用内连接,仅保留共有时间点 combined_csv_data = pd.concat(L, axis=1, join='inner') print(combined_csv_data) combined_csv_data.to_csv('combined_csv_data.csv')方案2:保留所有时间点,填充缺失值
如果你需要保留所有文件的全部时间点,可以在拼接后用插值/前向填充等方式处理NaN,适合时间序列是连续采样的场景:# 先按外连接拼接保留所有时间点 combined_csv_data = pd.concat(L, axis=1) # 线性插值填充缺失值,也可以替换为ffill()前向填充、bfill()后向填充、fillna(0)填0等逻辑 combined_csv_data = combined_csv_data.interpolate(method='linear')
内容的提问来源于stack exchange,提问作者AVK
相关产品推荐
相关产品推荐

