You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多DataFrame中选取与文件名同名列并合并为单DataFrame

解决TSV文件按文件名提取列并合并的问题

我来帮你修正代码,先说说原代码里的几个核心问题:

  • 内层循环遍历所有文件名,导致每个文件被重复处理多次,完全没必要
  • 没有保留ID列,最后合并时丢失了关键的匹配标识
  • 使用了已经被弃用的from_csv方法,现在推荐用pd.read_csv

下面是正确的实现思路和代码:

步骤说明

  1. 遍历每个TSV文件:逐个处理文件,先提取不带后缀的文件名(比如df1.tsv提取为df1)
  2. 读取并筛选列:读取文件时,只保留ID列和与文件名同名的目标列
  3. 合并所有数据:以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:03:30