筛选Pandas DataFrame列表时触发TypeError索引类型错误
报错原因
报错的核心问题是Python原生列表不支持用布尔序列做索引:
- 你定义的
merged_df是装了4个DataFrame的普通列表,列表的索引只接受整数、切片(比如merged_df[0]取第一个元素是合法写法),不接受pandas生成的True/False布尔序列作为索引值,所以会抛出TypeError: list indices must be integers or slices, not Series。 - 你单独对单个DataFrame做筛选能正常运行,是因为pandas DataFrame原生支持布尔索引,和普通列表的索引规则完全不同。
把多个DataFrame存入列表统一管理本身是合理的写法,只是你索引的写法写错了层级。
实现方案
根据你的实际需求选对应写法即可:
方案1:仅筛选列表中某一个DataFrame
如果你只是想筛选列表里的第一个DataFrame(也就是daily_df),要先通过索引从列表里取出对应DataFrame,再做布尔筛选:
# 先取merged_df[0]拿到daily_df,再执行筛选 condition1_data = merged_df[0][(merged_df[0]['change'] > 2) & (merged_df[0]['high'] > 4) ] print(condition1_data)
方案2:批量对列表里所有DataFrame执行相同筛选
如果要给4个周期的DataFrame都套同一个筛选条件,直接遍历列表处理即可:
import pandas as pd import numpy as np pd.set_option('display.max_rows', None) daily_df = pd.read_csv (r'Data\\CSV\daily.csv') sixtymin_df = pd.read_csv (r'Data\\CSV\sixtymin.csv') thirtymin_df = pd.read_csv (r'Data\\CSV\\thirtymin.csv') fivemin_df = pd.read_csv (r'Data\\CSV\\fivemin.csv') df_list = [daily_df, sixtymin_df, thirtymin_df, fivemin_df] cycle_names = ["日线", "60分钟线", "30分钟线", "5分钟线"] # 遍历逐个筛选 for cycle, df in zip(cycle_names, df_list): filtered_df = df[(df['change'] > 2) & (df['high'] > 4)] print(f"\n===== {cycle} 筛选结果 =====") print(filtered_df)
方案3:先合并所有DataFrame再统一筛选
如果你需要把所有周期的数据放在同一个表里筛选,可以先用pd.concat()把列表里的DataFrame合并成一个大表,再做筛选:
# 合并时增加cycle列标记数据所属周期,方便后续区分 merged_df = pd.concat( [df.assign(cycle=name) for name, df in zip(cycle_names, df_list)], ignore_index=True ) # 直接对合并后的大表做筛选 condition1_data = merged_df[(merged_df['change'] > 2) & (merged_df['high'] > 4)] print(condition1_data)
内容的提问来源于stack exchange,提问作者boioboi
相关产品推荐
相关产品推荐

