使用dropna()处理二维DataFrame后结果为空数组的问题排查
问题分析与解决方案
问题根源
- DataFrame的
dropna()默认参数为how='any',即只要某一行存在任意一个NaN,就会删除整行。如果你的Excel数据中每一行都至少包含一个NaN,执行dropna()后会得到空DataFrame,最终flatten后就是空数组。 - 而一维Series的
dropna()是直接移除单个NaN值,所以能正常清理。
解决方案
根据你的需求选择对应的处理方式:
需求1:提取所有非NaN的单元格值(不管行列)
直接先扁平化数据再清理NaN,或者用stack()将二维结构转为一维后处理:
import pandas as pd import numpy as np # 方式1:用stack转一维后删NaN data = pd.read_excel('/file.xlsx', sheet_name='Sheet1', engine='openpyxl') \ .astype(float) \ .stack() \ .dropna() \ .values \ .flatten() # 方式2:先转numpy数组再过滤NaN df = pd.read_excel('/file.xlsx', sheet_name='Sheet1', engine='openpyxl').astype(float) data = df.values.flatten()[~np.isnan(df.values.flatten())]
需求2:保留至少有一个非NaN值的行,再扁平化
调整dropna()的how参数为'all',仅删除全是NaN的行:
data = pd.read_excel('/file.xlsx', sheet_name='Sheet1', engine='openpyxl') \ .astype(float) \ .dropna(how='all') \ .values \ .flatten()
内容的提问来源于stack exchange,提问作者Leb_Broth
相关产品推荐
相关产品推荐

