如何在Pandas DataFrame中自动筛选最新3年有值的列?
自动筛选DataFrame中包含最新3年有效数据的列
问题场景
给定两个按年份降序排列列的DataFrame,部分年份对应单元格为空,需要自动筛选出最新的3个存在有效数据的年份列,无需手动指定列名。
原始数据
df1
| 2022 | 2021 | 2020 | 2019 | 2018 |
|---|---|---|---|---|
| 33 | 20 | 67 | 23 |
df2
| 2022 | 2021 | 2020 | 2019 | 2018 |
|---|---|---|---|---|
| 33 | 89 | 20 | 95 |
解决方案
直接写通用函数处理,核心逻辑是先识别有有效数据的列,再按原年份顺序取最新的3个:
import pandas as pd def filter_latest_valid_cols(df, top_n=3): # 标记每列是否存在非空有效数据(兼容NaN、空字符串两种空值情况) has_valid_data = (df.notna().any(axis=0)) | ((df != '').any(axis=0)) # 按原列顺序(年份从新到旧)筛选出前top_n个有效列 target_cols = has_valid_data[has_valid_data].index[:top_n] # 返回筛选后的DataFrame return df[target_cols]
测试示例
处理df1
# 构造原始df1 df1 = pd.DataFrame({ '2022': [33], '2021': [None], '2020': [20], '2019': [67], '2018': [23] }) result_df1 = filter_latest_valid_cols(df1) print(result_df1)
输出结果:
| 2022 | 2020 | 2019 |
|---|---|---|
| 33 | 20 | 67 |
处理df2
# 构造原始df2 df2 = pd.DataFrame({ '2022': [33], '2021': [89], '2020': [None], '2019': [20], '2018': [95] }) result_df2 = filter_latest_valid_cols(df2) print(result_df2)
输出结果:
| 2022 | 2021 | 2019 |
|---|---|---|
| 33 | 89 | 20 |
补充说明
- 若需要筛选最新N年,修改
top_n参数即可(比如top_n=2取最新2年) - 如果你的空值是其他形式(比如0),可调整
has_valid_data的判断逻辑,例如改为(df != 0).any(axis=0) - 确保DataFrame的列是年份从新到旧排列的,这样筛选结果才符合"最新"的要求
内容的提问来源于stack exchange,提问作者siusiusiu
相关产品推荐
相关产品推荐

