我有一个包含很多NA值的DataFrame。我想编写一个查询,返回特定列不是NA但所有其他列为NA的行。
我可以得到一个Dataframe,其中所有列值都不够NA:
df[df.interesting_column.notna()]
然而,我无法弄清楚如何然后说出#34;从那个DataFrame返回的行中只有每一列都不是' interesting_column'是NA"。我无法使用.dropna
,因为所有行和列都至少包含一个NA值。
我意识到这可能很尴尬。我已经尝试了很多.loc
变体,在各种配置中加入/合并,我没有到达任何地方。
在我为这件事做一个for循环之前的任何指针都将不胜感激。
答案 0 :(得分:3)
您可以简单地使用条件的组合:
df[df.interesting_column.notna() & (df.isnull().sum(axis=1) == len(df.columns) - 1)]
df.interesting_column.notna()
检查列是否为空。
df.isnull().sum(axis=1) == len(df.columns) - 1
检查行中的空值数是否为列数减去1
两个条件一起意味着列中的条目是唯一的非空条目。
答案 1 :(得分:2)
&
运算符允许您逐行"和"两个布尔列。目前,您正在使用df.interesting_column.notna()
为您提供一列TRUE
或FALSE
值。您可以根据需要使用notna()
或isna()
对所有列重复此操作,并使用&
运算符组合结果。
例如,如果您有列a
,b
和c
,并且您希望找到列a
中的值不是{{1其他列中的值为NaN
,然后执行以下操作:
NaN
如果您提前了解少量列,则这很简单。但是,如果您有很多列,或者您不知道列名称,那么您需要一个循环遍历所有列的解决方案,并检查df[df.a.notna() & df.b.isna() & df.c.isna()]
和notna()
interesting_column
对于其他列。 @AmiTavory的解决方案是实现这一目标的一种聪明方式。但是,如果你不了解这个解决方案,这里有一个更简单的方法。
isna()
答案 2 :(得分:1)
您可以使用:
rows = df.drop('interesting_column', axis=1).isna().all(1) & df['interesting_column'].notna()
示例(假设c
是有趣的专栏):
In [99]: df = pd.DataFrame({'a': [1, np.nan, 2], 'b': [1, np.nan, 3], 'c':[4, 5, np.nan]})
In [100]: df
Out[100]:
a b c
0 1.0 1.0 4.0
1 NaN NaN 5.0
2 2.0 3.0 NaN
In [101]: rows = df.drop('c', axis=1).isna().all(1) & df.c.notna()
In [102]: rows
Out[102]:
0 False
1 True
2 False
dtype: bool
In [103]: df[rows]
Out[103]:
a b c
1 NaN NaN 5.0