You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中自动筛选最新3年有值的列?

自动筛选DataFrame中包含最新3年有效数据的列

问题场景

给定两个按年份降序排列列的DataFrame,部分年份对应单元格为空,需要自动筛选出最新的3个存在有效数据的年份列,无需手动指定列名。

原始数据

df1

20222021202020192018
33206723

df2

20222021202020192018
33892095

解决方案

直接写通用函数处理,核心逻辑是先识别有有效数据的列,再按原年份顺序取最新的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)

输出结果:

202220202019
332067

处理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)

输出结果:

202220212019
338920

补充说明

  • 若需要筛选最新N年,修改top_n参数即可(比如top_n=2取最新2年)
  • 如果你的空值是其他形式(比如0),可调整has_valid_data的判断逻辑,例如改为(df != 0).any(axis=0)
  • 确保DataFrame的列是年份从新到旧排列的,这样筛选结果才符合"最新"的要求

内容的提问来源于stack exchange,提问作者siusiusiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:05:32