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

Python pandas:修正循环逻辑以实现多TSV文件TESS列按指定顺序追加至统一索引空DataFrame

解决TSV文件TESS列按指定顺序合并到DataFrame的问题

问题背景

你需要把16个TSV文件里的TESS列,按指定顺序填充到预先创建好的all_methods DataFrame中,要求索引匹配,不匹配的位置填NaN,但当前的循环逻辑出了问题,没法实现预期效果。

问题诊断

你的核心问题有两个:

  • 嵌套循环遍历每个TESS值和每个列,这会导致重复赋值,完全偏离了“一个文件对应一个列”的目标
  • os.walk的文件遍历顺序是不确定的,没法保证第一个读到的文件就对应C1列,第二个对应C2列,这会导致列的顺序混乱

修正后的完整代码

import os
import pandas as pd

# 1. 构建合并后的索引(修正原代码的合并逻辑)
os.chdir(r'....')
c4_add = pd.read_csv('c4symbols.csv', index_col=[0], usecols=[0])
c5_add = pd.read_csv('c5symbols.csv', index_col=[0], usecols=[0])
c6_add = pd.read_csv('c6symbols.csv', index_col=[0], usecols=[0])
c7_add = pd.read_csv('c7symbols.csv', index_col=[0], usecols=[0])

# 用union合并多个索引,这才是正确的多索引合并方式
combined_symbols = c4_add.index.union(c5_add.index).union(c6_add.index).union(c7_add.index)
# 如果你确实需要去掉首尾索引,保留这行
combined_symbols = combined_symbols[1:-1]

# 2. 创建目标DataFrame
target_columns = ['C1','C2','E1','E2','M1','M2','M3','M4', 'Q1','Q2','Q3','T1','T2','T3','X1','X2']
all_methods = pd.DataFrame(index=combined_symbols, columns=target_columns)

# 3. 收集所有符合条件的TSV文件,重点是保证顺序!
target_files = []
for root, dirs, files in os.walk(r'.....'):
    for file in files:
        if file.endswith(".tsv") and 'report_for_na' in file:
            target_files.append(os.path.join(root, file))

# ✅ 关键:确保文件顺序和目标列顺序完全对应
# 如果文件名里包含C1/C2这类标识,可以按这个规律排序:
# target_files.sort(key=lambda x: next(col for col in target_columns if col in x))
# 如果文件名没规律,建议手动指定16个文件的路径,避免顺序出错:
# target_files = [
#     'path/to/your/C1_file.tsv',
#     'path/to/your/C2_file.tsv',
#     'path/to/your/E1_file.tsv',
#     # ... 依次添加剩下的13个文件路径
# ]

# 4. 按顺序遍历文件和对应列,完成赋值
for file_path, col_name in zip(target_files, target_columns):
    df = pd.read_table(file_path, sep='\t')
    # 检查列数是否符合你的要求(原代码的len(df.T)==12等价于列数12)
    if len(df.columns) == 12:
        df.set_index('NAME', inplace=True)
        # 重新索引,自动填充不匹配的索引为NaN
        tess_data = df['TESS'].reindex(all_methods.index)
        # 直接赋值到目标列
        all_methods[col_name] = tess_data

# 查看结果
print(all_methods.head())

核心优化点

  1. 索引合并修复:原代码用combine方法合并索引是错误的,改用index.union()可以正确合并多个索引集合。
  2. 文件顺序控制:这是实现按指定列填充的核心,要么按文件名规律排序,要么手动指定文件路径,确保第一个文件对应C1,第二个对应C2,以此类推。
  3. 循环逻辑简化:用zip同时遍历文件路径和目标列名,一次处理一个文件就直接完成对应列的赋值,完全避免了原代码中无效的嵌套循环。
  4. 自动NaN填充:reindex()方法会自动将不匹配的索引位置填充为NaN,比手动用isin筛选更简洁可靠。

内容的提问来源于stack exchange,提问作者TheUndecided

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:32:29