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