我有一个数据框,其中包含所有列的某些行中的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
答案 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