在 pandas 中检查“NaN”值时排除“None”

3

我正在清理数据集中的NaN,以便在其上运行线性回归。在此过程中,我将一些NaN替换为None。 完成后,我使用以下代码检查仍具有NaN值的列,其中houseprice是数据框的名称。

def cols_NaN():
    return houseprice.columns[houseprice.isnull().any()].tolist()
print houseprice[cols_NaN()].isnull().sum()

问题在于上述结果还包括None值。我想选择那些有NaN值的列。我该怎么做?

根据 isnull()NaNNone 都解析为 null。你最好在另一个序列中跟踪中间替换。 - piRSquared
2个回答

7

我能想到的唯一一件事就是检查元素是否为 float,因为 np.nanfloat 类型且为空。

考虑数据框 df

df = pd.DataFrame(dict(A=[1., None, np.nan]), dtype=np.object)

print(df)

      A
0     1
1  None
2   NaN

然后我们测试是否同时满足 floatisnull.
df.A.apply(lambda x: isinstance(x, float)) & df.A.isnull()

0    False
1    False
2     True
Name: A, dtype: bool

3

处理列名时有些不同,因为需要使用 mappandas.isnull:

对于 houseprice.columns.apply()houseprice.columns.isnull() 如果出现错误:

AttributeError: 'Index' 对象没有属性 'apply'

AttributeError: 'Index' 对象没有属性 'isnull'

houseprice = pd.DataFrame(columns = [np.nan, None, 'a'])

print (houseprice)
Empty DataFrame
Columns: [nan, None, a]

print (houseprice.columns[(houseprice.columns.map(type) == float) & 
                          (pd.isnull(houseprice.columns))].tolist())
[nan]

要检查DataFrame中的所有值,需要使用applymap函数:

houseprice = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6],
                   'C':[np.nan,8,9],
                   'D':[1,3,5],
                   'E':['a','s',None],
                   'F':[np.nan,4,3]})

print (houseprice)
   A  B    C  D     E    F
0  1  4  NaN  1     a  NaN
1  2  5  8.0  3     s  4.0
2  3  6  9.0  5  None  3.0

print (houseprice.columns[(houseprice.applymap(lambda x: isinstance(x, float)) & 
                           houseprice.isnull()).any()])
Index(['C', 'F'], dtype='object')

对于这段代码,简化后的写法是使用sum函数来求取boolean mask中为True的值的总和:

print ((houseprice.applymap(lambda x: isinstance(x, float)) & 
        houseprice.isnull()).any().sum())
2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接