如何用另一DataFrame的列过滤目标DataFrame 二者索引不同且第二个数据量小
问题解决方法
错误原因
- 直接执行
file.Time == time报错的核心原因:pandas进行Series逐元素比较时要求两个对象的索引完全对齐,你的file有30398行、time只有70行,二者索引完全不一致,因此触发该报错。 - 原有代码的额外逻辑问题:若
time是DataFrame类型,for i in time遍历的是DataFrame的列名,而非你需要的每行时间值,也会导致匹配失败。
修复方案
我们可以用pandas自带的isin()方法实现批量值匹配,同时提取公共过滤条件减少重复计算,相比循环效率提升明显,调整后代码如下:
def FilteringData(): # 先提取需要匹配的时间列表,假设time中存储时间的列名为TIME,若列名不同自行替换 time_match_list = time['TIME'].tolist() min_expiry = file.EXPIRY.min() # 提取公共过滤条件,减少重复计算 base_condition = (file.EXPIRY == min_expiry) & (file.OPTION_TYPE == op) & (file.TIME.isin(time_match_list)) # 分别筛选三个条件的数据 con_a = file[base_condition & (file.STRIKE_PRICE == str(main_strike))] con_b = file[base_condition & (file.STRIKE_PRICE == str(add_strike))] con_c = file[base_condition & (file.STRIKE_PRICE == str(sub_strike))] # 如果你需要按每个时间点拆分存储结果,可以再分组,输出格式和原代码一致 # con_a = [group for _, group in con_a.groupby('TIME')] # con_b = [group for _, group in con_b.groupby('TIME')] # con_c = [group for _, group in con_c.groupby('TIME')] return con_a, con_b, con_c con_a, con_b, con_c = FilteringData()
注意事项
如果time本身就是存储时间的Series而非DataFrame,提取匹配列表的代码改为time_match_list = time.tolist()即可。
内容的提问来源于stack exchange,提问作者Krishna Gupta
相关产品推荐
相关产品推荐

