如何使用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值的行和列,预期结果如下:
| A | C | |
|---|---|---|
| Monday | 19 | 19 |
| Friday | 19 | 19 |
尝试过的错误方法
以下代码无法得到预期结果:
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
相关产品推荐
相关产品推荐

