提取仅包含NaN和0的行

时间:2018-03-27 05:47:57

标签: python pandas nan sklearn-pandas

我有一个数据框,其中包含所有列的某些行中的NaN和0。我试图提取这些行,以便我可以进一步处理它们。此外,其中一些列是对象,一些是浮点数。我正在尝试下面的代码来提取这些行,但由于列是对象,它没有给我所需的结果。

现在,我可以通过将一些任意值替换为NaN并在.isin语句中使用它来解决此问题,但是它也会更改我的列的数据类型,我将不得不将它们转换回来。

有人可以帮我解决这个问题。 感谢。

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[np.nan,0,np.nan,1,'abc'], 'b':[0,np.nan,np.nan,1,np.nan]})

df

     a   b
0   NaN 0.0
1   0   NaN
2   NaN NaN
3   1   1.0
4   abc NaN
5   NaN 1.0

values = [np.nan,0]
df_all_empty = df[df.isin(values).all(1)]
df_all_empty

预期产出:

     a   b
0   NaN 0.0
1   0   NaN
2   NaN NaN

实际输出:

     a  b
0   NaN 0.0

3 个答案:

答案 0 :(得分:3)

更改

df_all_empty = df[(df.isnull()|df.isin([0])).all(1)]

答案 1 :(得分:0)

以下代码可让您选择这些行。

df_sel = df.loc[(df.a.isnull()) | \
                (df.b.isnull()) | \
                (df.a==0)       | \
                (df.b==0)           ]

如果你想制作专栏' a'在这些行中,例如-9999,您可以使用:

df.loc[(df.a.isnull()) | \
       (df.b.isnull()) | \
       (df.a==0)       | \
       (df.b==0)           , 'a'] = -9999

供参考,请参阅

中的官方文档

https://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

答案 2 :(得分:0)

您可以使用df.query,以及描述here的技巧(通过检查值是否等于自身与NaN进行比较)

写下这样的东西:

df.query("(a!=a or a==0) and (b!=b or b==0)")

输出是:

     a    b
0  NaN  0.0
1    0  NaN
2  NaN  NaN