如何将含公共列的多个CSV文件合并为单个DataFrame
解决多CSV文件基于公共列合并的问题
你遇到的问题很常见——pd.concat是按行堆叠数据,而你需要的是基于公共列把不同文件的列横向合并到一起,所以才会出现部分列全NaN的情况。下面是正确的解决方法:
问题原因解释
pd.concat(map(pd.read_csv, filepaths), sort=False)会把所有CSV的行依次堆起来,每个CSV只有自己的专属列(比如file1有var1/2/3,file2有var4/5/6),所以当file1的行被堆叠后,var4/5/6列自然没有数据,就会填充NaN;同理file2的行堆叠后,var1/2/3列也是NaN。这显然不是你想要的“整合所有列到同一个DataFrame”的效果。
正确解决方案:按公共列合并(merge)
我们需要以common_col1和common_col2为匹配键,把每个CSV的数据横向合并到一起,确保相同的行能对应上所有文件的列。
步骤1:导入依赖库
import pandas as pd import glob # 用glob更方便匹配CSV文件
步骤2:获取所有CSV文件路径
用glob可以直接匹配指定目录下的所有CSV,比os.listdir更精准:
filepaths = glob.glob("/home/csvfiles/*.csv")
步骤3:逐步合并所有文件
先读取第一个文件作为基础,再依次和剩下的文件做合并:
# 初始化合并后的DataFrame merged_df = pd.read_csv(filepaths[0]) # 遍历剩余文件并合并 for filepath in filepaths[1:]: # 读取当前CSV current_df = pd.read_csv(filepath) # 按公共列合并,how='outer'保留所有行(可根据需求调整) merged_df = pd.merge( merged_df, current_df, on=['common_col1', 'common_col2'], how='outer' # 如果只保留所有文件都存在的行,改用how='inner' )
关键参数说明
on=['common_col1', 'common_col2']:指定用这两列作为匹配的主键,确保行能正确对应how='outer':保留所有出现在任意CSV里的行,如果某行在某个CSV里没有数据,对应的列会填充NaN(这是合理的缺失值);如果只需要保留所有CSV都存在的行,换成how='inner'即可
验证结果
合并后的merged_df会包含所有CSV的列:common_col1、common_col2、var1、var2、var3、var4、var5、var6... 并且每个行对应的各列数据都会正确匹配,不会出现全NaN的列(除非某个列在所有文件里都没有对应行的数据,但这种情况很少)。
内容的提问来源于stack exchange,提问作者AKS
相关产品推荐
相关产品推荐

