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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:12:03