使用notnull()过滤Pandas DataFrame时空值未被移除的问题
问题分析与修复方案
你的过滤器没生效,主要是CSV导入时的空值识别、数据类型问题,再加上代码里的小语法错误导致的,具体修复如下:
核心问题点
- 空值没被正确识别:CSV里的空单元格导入后可能是空字符串
"",而notnull()会把空字符串判定为非空,导致过滤逻辑失效。 - 数值列类型错误:如果数值列被识别成字符串类型,
>0的比较根本起不了作用。 - 语法错误:代码里
filter1 | filter 2 | filteretc中的filter 2多了空格,应该写成filter2。
修正后的完整代码
import pandas as pd # 导入CSV时明确处理空值,指定数值列类型 df = pd.read_csv( "file/path/unfiltered.csv", na_values=["", " "], # 把空字符串、空格都识别为NaN dtype={ "Type 1 Data": float, "Type 2 Data": float, "TypeEtc Data": float } ) # 重新编写过滤器,用isna()判断空值更准确 filter1 = (df["DataType"] == "Type 1") & (~df["Type 1 Data"].isna()) & (df["Type 1 Data"] > 0) filter2 = (df["DataType"] == "Type 2") & (~df["Type 2 Data"].isna()) & (df["Type 2 Data"] > 0) filteretc = (df["DataType"] == "TypeEtc") & (~df["TypeEtc Data"].isna()) & (df["TypeEtc Data"] > 0) # 合并过滤器,注意变量名不要有空格 filtered_df = df[filter1 | filter2 | filteretc] # 导出时不要带索引,避免多余列 filtered_df.to_csv("file/path/filtered.csv", index=False)
验证步骤(可选)
- 运行
df.info()检查列类型,确保数值列是float64而非object。 - 运行
df.isna().sum()查看空值统计,确认空单元格已被转为NaN。 - 单独打印过滤器结果(比如
print(filter1)),确认符合条件的行被正确标记。
内容的提问来源于stack exchange,提问作者coghlan
相关产品推荐
相关产品推荐

