如何使用Python删除pandas数据框转列表后包含nan空元素的行
问题根源
Python 中bool(float('nan'))返回值为True,你原有代码中的if k[0] and k[1] and k[2] and k[3]条件无法识别过滤包含nan的行,会把nan作为有效值传入自定义类,导致逻辑异常。
可直接使用的两种修改方案
方案1:提前将DataFrame空值替换为Python原生None(推荐)
该方案会把所有nan/NaT等pandas空类型替换为Python原生的None,None的布尔值为False,可以直接适配你原有的过滤逻辑,后续类实例中的空字段也符合Python原生空值的使用习惯。
完整修改代码如下:
import os import pandas as pd import math cwd = os.path.abspath('') files = os.listdir(cwd) df = pd.DataFrame() for file in files: if file.endswith('.XLSX'): # 兼容pandas 2.0+版本,替换已废弃的append方法 df = pd.concat([df, pd.read_excel(file)], ignore_index=True) # 新增空值替换逻辑 df = df.where(pd.notna(df), None) array = df.values.tolist() print(array) class Item(): def __init__(self, name, cost, gender, prime): self.__name = name self.__cost = cost self.__gender = gender self.__prime = prime def __repr__(self): return f"Item({self.__name},{self.__cost},{self.__gender},{self.__prime})" # 原有过滤逻辑无需修改 mylist = [Item(*k) for k in array if k[0] and k[1] and k[2] and k[3]] print(mylist)
方案2:仅修改过滤条件,无需提前处理数据
如果你不需要修改原数据,只需要过滤掉所有包含空值的行,可以直接在列表推导式的条件中使用pandas提供的通用非空判断函数pd.notna(),该函数可同时兼容识别nan和None两种空类型:
# 仅替换原mylist生成逻辑即可 mylist = [Item(*k) for k in array if all(pd.notna(x) for x in k)]
扩展补充
如果需要同时过滤掉全空白的字符串单元格(比如Excel中单元格输入了空格的情况),可以将过滤条件调整为:
mylist = [Item(*k) for k in array if all(pd.notna(x) and str(x).strip() != '' for x in k)]
内容的提问来源于stack exchange,提问作者zhangruibo101
相关产品推荐
相关产品推荐

