Pandas:查找特定列不是NA但所有其他列都是的行

时间:2018-05-17 17:49:10

标签: python pandas

我有一个包含很多NA值的DataFrame。我想编写一个查询,返回特定列不是NA但所有其他列为NA的行。

我可以得到一个Dataframe,其中所有列值都不够NA:

df[df.interesting_column.notna()]

然而,我无法弄清楚如何然后说出#34;从那个DataFrame返回的行中只有每一列都不是' interesting_column'是NA"。我无法使用.dropna,因为所有行和列都至少包含一个NA值。

我意识到这可能很尴尬。我已经尝试了很多.loc变体,在各种配置中加入/合并,我没有到达任何地方。

在我为这件事做一个for循环之前的任何指针都将不胜感激。

3 个答案:

答案 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()为您提供一列TRUEFALSE值。您可以根据需要使用notna()isna()对所有列重复此操作,并使用&运算符组合结果。

例如,如果您有列abc,并且您希望找到列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