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

如何使用Pandas筛选DataFrame中非NaN的行与列?

问题:筛选DataFrame中所有非NaN的行和列

场景与需求

假设存在如下DataFrame:

import pandas as pd
df = pd.DataFrame(columns = ['A','B','C'], index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'])
df.loc[['Monday', 'Friday'], ['A', 'C']] = 19

需要输出所有包含非NaN值的行和列,预期结果如下:

AC
Monday1919
Friday1919

尝试过的错误方法

以下代码无法得到预期结果:

df = df[df.isna()]
df[(df.iloc[::]) & (df.isnull() == False)]

正确解决方法

方法一:使用dropna方法

通过两次调用dropna,先删除全为NaN的列,再删除全为NaN的行:

# 先移除所有值都是NaN的列,再移除所有值都是NaN的行
filtered_df = df.dropna(axis=1, how='all').dropna(axis=0, how='all')
print(filtered_df)
  • dropna(axis=1, how='all'):删除所有元素均为NaN的列(此处会删除列B)
  • dropna(axis=0, how='all'):删除所有元素均为NaN的行(此处会删除Tuesday、Wednesday、Thursday行)

方法二:布尔索引筛选

通过布尔序列分别筛选有效行和有效列:

# 筛选出至少有一个非NaN值的列
valid_columns = df.notna().any(axis=0)
# 筛选出至少有一个非NaN值的行
valid_rows = df.notna().any(axis=1)
# 提取对应的行和列
filtered_df = df.loc[valid_rows, valid_columns]
print(filtered_df)
  • df.notna().any(axis=0):检查每列是否存在非NaN值,返回布尔序列用于筛选列
  • df.notna().any(axis=1):检查每行是否存在非NaN值,返回布尔序列用于筛选行

错误方法说明

  • df[df.isna()]:直接用全布尔矩阵索引DataFrame,会得到一个全为NaN的结果,不符合需求
  • df[(df.iloc[::]) & (df.isnull() == False)]:逻辑错误,df.iloc[::]是原DataFrame的所有行,无法和布尔条件正确组合,因此无法筛选出目标数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:23:25