Python如何删除含空单元格的DataFrame行及dropna报错解决
问题原因与解决方案
报错核心原因
AttributeError: 'NoneType' object has no attribute 'dropna' 说明调用dropna()的变量并非有效的pandas DataFrame对象,实际取值为None,常见触发场景如下:
- 你提供的
getWeather函数没有补充返回值,外部调用该函数赋值给变量时,默认会拿到None - 冗余的JSON转换步骤导致
pd.json_normalize解析失败,返回了None - 从MongoDB查询到的记录为空,后续生成DataFrame的步骤异常返回None
优化处理逻辑
- 删除冗余转换:将DataFrame转JSON再用
pd.json_normalize转回DataFrame的操作完全多余,除非你有嵌套字段需要平铺,否则直接用MongoDB查询结果生成DataFrame即可 - 空值兼容:CSV或MongoDB中存储的空字符串不会被
dropna默认识别为空值,需要先统一替换为NaN再执行删行操作 - 增加边界校验:提前判断查询结果是否为空,避免后续操作无意义报错
- 补充函数返回值:避免外部调用时拿到None
可运行修改版代码
def getWeather(self, collection, database): import pymongo import pandas as pd import numpy as np print('--------------') print(f'database = {database}') print(f'collection = {collection}') # 建立MongoDB客户端连接 client = pymongo.MongoClient("mongodb+srv://...") # 读取指定集合的全部记录 records = client[database][collection] record_list = list(records.find()) # 校验查询结果非空 if not record_list: print("未从MongoDB中查询到任何有效记录") return pd.DataFrame() # 直接生成DataFrame,跳过冗余转换步骤 dataframe = pd.DataFrame(record_list) # 将空字符串等无效值统一替换为NaN,方便dropna识别 dataframe = dataframe.replace('', np.nan) # 删除包含任意空值的行,符合你的业务需求 dataframe = dataframe.dropna(axis=0, how='any') # 补充返回值,外部调用可直接拿到处理后的DataFrame return dataframe
内容的提问来源于stack exchange,提问作者Buster3650
相关产品推荐
相关产品推荐

