如何对pandas DataFrame列表内各元素按列值条件筛选数据
实现方案
你只需要对每个DataFrame加布尔索引筛选即可,有两种常用实现方式:
方案1:读取文件时直接筛选(推荐,内存效率更高)
直接修改原有循环的append逻辑,在读取文件、提取目标列后立刻做行筛选,代码如下:
import os import pandas as pd os.chdir('C:/Users/OneDrive/Desktop/py2convers/psychoflicker-master/src/data/TESTPILOTA1/pythonProject1/Data') filelist = os.listdir() filelist = sorted(filelist, key=lambda x: int(os.path.splitext(x)[0])) print(filelist) interest = [] for file2 in filelist: if file2.endswith('.txt'): df3 = pd.read_table(file2) # 提取目标列后,仅保留Trial Condition为Bilateral-Left的行,末尾NaN行也会被自动过滤 filtered_df = df3[['Trial Condition', 'Response']][df3['Trial Condition'] == 'Bilateral-Left'] interest.append(filtered_df) # 可通过如下代码验证筛选结果 print(interest[0])
方案2:对已生成的全量列表二次筛选
如果你已经运行原有代码生成了存储全量数据的interest列表,不想重新读取文件,可以直接遍历列表做筛选:
- 普通for循环写法
interest_filtered = [] for df in interest: filtered_df = df[df['Trial Condition'] == 'Bilateral-Left'] interest_filtered.append(filtered_df)
- 更简洁的列表推导式写法
interest_filtered = [df[df['Trial Condition'] == 'Bilateral-Left'] for df in interest]
注意事项
- 筛选条件里的
Bilateral-Left要和列内实际值完全匹配,注意大小写、前后隐形空格,如果存在格式不一致问题,可以先做列值清洗再筛选:df['Trial Condition'] = df['Trial Condition'].str.strip() - 上述筛选逻辑会自动排除
Trial Condition为Bilateral-Right的行,以及末尾值为NaN的空行,不需要额外调用dropna()方法
内容的提问来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

