如何用Python循环处理文本文件并提取PTA列含NaN的行
批量提取多文件中含NaN的行并添加文件名列
需求说明
我有多份制表符分隔的文本文件,需要:
- 提取所有文件中PTA列包含NaN值的行
- 为提取出的每一行添加对应的文件名作为额外列
示例数据
File1内容
i B C D E F G H I J PTA K L 0 0.24055 0.31092 0.03447 0.00015 0.93464 0.08232 0.52609 0.00560 0.44018 0.06337 236 770 1 0.43976 0.45359 0.01220 0.93317 0.05711 0.06316 0.49310 0.05882 0.51825 0.18522 433 573 2 0.48067 0.17356 0.96903 0.02968 0.08864 0.05567 0.30423 0.02337 0.01981 0.56240 481 525 3 0.41872 0.18580 0.00191 0.08048 0.90871 0.02035 0.23598 0.01610 0.19815 NaN 422 584
File2内容
i B C D E F G H I J PTA K L 0 0.1234 0.31092 0.356 0.00015 0.93464 0.08232 0.52609 0.5873 0.0034 0.06337 367 985 1 0.975 0.367 0.01220 0.875 0.05711 0.0365 0.49310 0.05882 0.51825 NaN 635 784 2 0.48067 0.17356 0.96903 0.02968 0.08864 0.05567 0.30423 0.02337 0.01981 0.823 956 213 3 0.41872 0.18580 0.00191 0.08048 0.90871 0.02035 0.23598 0.01610 0.19815 1.30621 678 943
期望输出
i B C D E F G H I J PTA K L filename 3 0.41872 0.18580 0.00191 0.08048 0.90871 0.02035 0.23598 0.01610 0.19815 NaN 422 584 File1 1 0.97500 0.36700 0.01220 0.87500 0.05711 0.03650 0.49310 0.05882 0.51825 NaN 635 784 File2
现有代码
# import required module import os import pandas as pd # assign directory directory = 'files' for filename in os.listdir(directory): f = os.path.join(directory, filename) df=pd.read_csv(f, sep='\t',comment='#') print(df) rows=df[df['PTA'].isna()] print(rows)
解决方案
在现有代码基础上,添加收集筛选结果和合并数据的逻辑即可:
- 初始化空列表存储每个文件的筛选结果
- 为筛选出的行新增文件名列
- 循环结束后合并所有结果
完整代码
import os import pandas as pd # 目标文件夹路径 directory = 'files' # 初始化空列表存储结果 result_list = [] for filename in os.listdir(directory): file_path = os.path.join(directory, filename) # 读取制表符分隔的文件 df = pd.read_csv(file_path, sep='\t', comment='#') # 筛选PTA列为NaN的行 filtered_rows = df[df['PTA'].isna()] # 添加文件名列(保留原始文件名) filtered_rows['filename'] = filename # 将筛选结果加入列表 result_list.append(filtered_rows) # 合并所有结果为一个DataFrame final_df = pd.concat(result_list, ignore_index=False) # 可选:查看结果或导出到文件 print(final_df) # final_df.to_csv('filtered_result.tsv', sep='\t', index=False)
关键说明
filtered_rows['filename'] = filename:为筛选行添加文件名,方便溯源pd.concat(result_list):将多个子DataFrame合并成完整结果ignore_index=False:保留原文件的行索引,不需要可设为True
内容的提问来源于stack exchange,提问作者Luker354
相关产品推荐
相关产品推荐

