提取仅包含 NaN 和 0 的行

extract rows which contain only NaN and 0

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

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

有人可以帮我 workaround/solution 吗? 谢谢

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

改变

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

下面的代码会让您 select 这些行。

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

您可以使用 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