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())
核心优化点
- 索引合并修复:原代码用
combine方法合并索引是错误的,改用index.union()可以正确合并多个索引集合。 - 文件顺序控制:这是实现按指定列填充的核心,要么按文件名规律排序,要么手动指定文件路径,确保第一个文件对应
C1,第二个对应C2,以此类推。 - 循环逻辑简化:用
zip同时遍历文件路径和目标列名,一次处理一个文件就直接完成对应列的赋值,完全避免了原代码中无效的嵌套循环。 - 自动NaN填充:
reindex()方法会自动将不匹配的索引位置填充为NaN,比手动用isin筛选更简洁可靠。
内容的提问来源于stack exchange,提问作者TheUndecided
相关产品推荐
相关产品推荐

