如何对多个pandas DataFrame按相同日期范围进行批量过滤?
问题原因
- 循环中的
df是临时变量,仅指向列表中的DataFrame对象,直接对df重新赋值只会改变临时变量的指向,不会修改原列表中的元素,也不会修改你预先定义的df1、df2变量。 - 你现有代码仅生成了布尔类型的过滤掩码,没有用掩码对DataFrame做索引,更没有保存过滤后的新DataFrame对象。
- 你提到的其他格式调整操作可以生效,是因为这类操作属于对DataFrame对象本身的修改(inplace操作),会直接作用到原对象上;而过滤会生成全新的DataFrame对象,必须替换原有引用才能生效。
解决方案
首先建议先将Date列转为datetime类型,避免字符串日期比较的潜在异常,再通过索引遍历列表,将过滤后的新DataFrame赋值回列表对应位置即可:
import pandas as pd # 初始化DataFrame d1 = {'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'], 'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10] } df1 = pd.DataFrame(data=d1) d2 = {'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'], 'C': [11, 12, 13, 14, 15], 'D': [16, 17, 18, 19, 20] } df2 = pd.DataFrame(data=d2) df_list = [df1, df2] start_date = '2021-01-01' end_date = '2021-01-05' # 批量过滤 for idx in range(len(df_list)): # 转日期列 df_list[idx]['Date'] = pd.to_datetime(df_list[idx]['Date']) # 生成过滤掩码 filter_mask = (df_list[idx]['Date'] > start_date) & (df_list[idx]['Date'] < end_date) # 过滤后赋值回列表 df_list[idx] = df_list[idx][filter_mask] # 其他格式调整操作可在此处直接操作df_list[idx] # 取出过滤后的结果 filtered_df1, filtered_df2 = df_list
输出示例
运行上述代码后filtered_df1的输出如下:
Date A B 1 2021-01-02 2 7 2 2021-01-03 3 8 3 2021-01-04 4 9
内容的提问来源于stack exchange,提问作者sugarfreegum
相关产品推荐
相关产品推荐

