Панды: Найти строки, где конкретный столбец не является NA, но все остальные столбцы - PullRequest
0 голосов
/ 17 мая 2018

У меня есть DataFrame, который содержит много значений NA. Я хочу написать запрос, который возвращает строки, в которых конкретный столбец не является NA, но все остальные столбцы являются NA.

Я могу получить Dataframe, где все значения столбцов не достаточно просто NA:

df[df.interesting_column.notna()]

Однако я не могу понять, как сказать: «из этого DataFrame возвращаются только строки, каждый столбец которых не является« интересным столбцом », как NA». Я не могу использовать .dropna, так как все строки и столбцы будут содержать хотя бы одно значение NA.

Я понимаю, что это, вероятно, смущающе просто. Я перепробовал множество .loc вариантов, объединяю / объединяю в разных конфигурациях, и я никуда не денусь.

Буду признателен за любые указатели, прежде чем я просто сделаю цикл for для этой вещи.

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Оператор & позволяет вам строка за строкой "и" вместе два логических столбца.Прямо сейчас вы используете df.interesting_column.notna(), чтобы получить столбец значений TRUE или FALSE.Вы можете повторить это для всех столбцов, используя notna() или isna() по желанию, и использовать оператор & для объединения результатов.

Например, если у вас есть столбцы a, b и c, и вы хотите найти строки, в которых значение в столбцах a не равно NaN, а значения в других столбцах NaN, затем выполните следующие действия:

df[df.a.notna() & df.b.isna() & df.c.isna()]

Это ясно и просто, если у вас есть небольшое количество столбцов, о которых вы знаете заранее.Но если у вас много столбцов или вы не знаете имен столбцов, вам нужно решение, которое перебирает все столбцы и проверяет notna() для interesting_column и isna() для других столбцов.Решение @AmiTavory - умный способ добиться этого.Но, если вы не знали об этом решении, вот более простой подход.

for colName in df.columns:
    if colName == "interesting_column":
        df = df[ df[colName].notna() ]
    else:
        df = df[ df[colName].isna() ]
0 голосов
/ 17 мая 2018

Вы можете просто использовать сочетание условий:

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

Оба условия вместе означают, что запись в столбце является ненулевой.

0 голосов
/ 17 мая 2018

Вы можете использовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...