如何从多DataFrame中选取与文件名同名列并合并为单DataFrame
解决TSV文件按文件名提取列并合并的问题
我来帮你修正代码,先说说原代码里的几个核心问题:
- 内层循环遍历所有文件名,导致每个文件被重复处理多次,完全没必要
- 没有保留
ID列,最后合并时丢失了关键的匹配标识 - 使用了已经被弃用的
from_csv方法,现在推荐用pd.read_csv
下面是正确的实现思路和代码:
步骤说明
- 遍历每个TSV文件:逐个处理文件,先提取不带后缀的文件名(比如
df1.tsv提取为df1) - 读取并筛选列:读取文件时,只保留
ID列和与文件名同名的目标列 - 合并所有数据:以
ID为键,将所有筛选后的小DataFrame做外连接,这样所有ID都会被保留,缺失值自动填充为NaN
完整代码
import os import pandas as pd path = 'usr/fils/data' all_files = [os.path.join(path, i) for i in os.listdir(path) if i.endswith('.tsv')] # 初始化最终的DataFrame,先处理第一个文件作为基础 first_file = all_files[0] first_filename = os.path.splitext(os.path.basename(first_file))[0] # 去掉后缀得到列名 df_final = pd.read_csv(first_file, sep="\t")[['ID', first_filename]] # 处理剩下的文件 for file in all_files[1:]: # 获取不带后缀的文件名,也就是我们要提取的列名 col_name = os.path.splitext(os.path.basename(file))[0] # 读取文件,只保留ID和目标列 df_temp = pd.read_csv(file, sep="\t")[['ID', col_name]] # 按ID外连接,保留所有ID,缺失值补NaN df_final = pd.merge(df_final, df_temp, on='ID', how='outer') print(df_final)
代码解释
os.path.splitext(os.path.basename(file))[0]:这个方法可以准确提取不带后缀的文件名,比如df2.tsv会得到df2,避免手动处理后缀的麻烦pd.merge(..., how='outer'):外连接会保留所有参与合并的DataFrame中的ID,不管某个ID在其他文件中是否存在,缺失的列值会自动填充为NaN,正好符合你期望的输出效果- 先处理第一个文件作为初始的
df_final,然后逐个合并剩下的文件,逻辑清晰且高效
测试一下你给出的示例数据,运行这段代码后就能得到你想要的df_final结果啦。
内容的提问来源于stack exchange,提问作者ARJ
相关产品推荐
相关产品推荐

