2015-12-15 12 views
8

Я использую метод pandas.DataFrame.dropna для удаления строк, содержащих NaN. Эта функция возвращает блок данных, который исключает удаленные строки, как показано в документации.Pandas dropna - магазин упал рядами

Как сохранить копию удаленных строк в виде отдельного блока данных? Является:

mydataframe[pd.isnull(['list', 'of', 'columns'])] 

всегда гарантированно возвращает те же строки, что dropna капель, предполагая, что dropna называется с subset=['list', 'of', 'columns']?

ответ

10

Вы можете сделать это, указав исходный DataFrame с помощью unary ~ (invert) operator, чтобы дать обратный NA свободный DataFrame.

na_free = df.dropna() 
only_na = df[~df.index.isin(na_free.index)] 

Другим вариантом является использование ufunc implementation of ~.

only_na = df[np.invert(df.index.isin(na_free.index))] 
+0

Мне очень нравится это решение. Обратите внимание, что '-' устарел в пользу' ~ '. – johnchase

2

Я собирался оставить комментарий, но решил, что напишу ответ, поскольку он начал становиться довольно сложным. Начнем с следующего кадра данных:

import pandas as pd 
import numpy as np 
df = pd.DataFrame([['a', 'b', np.nan], [np.nan, 'c', 'c'], ['c', 'd', 'a']], 
       columns=['col1', 'col2', 'col3']) 
df 
    col1 col2 col3 
0 a b NaN 
1 NaN c c 
2 c d a 

И сказать, что мы хотим держать строки с Nans в колонках col2 и col3 Один из способов сделать это заключается в следующем: который основан на ответах от this post

df.loc[pd.isnull(df[['col2', 'col3']]).any(axis=1)] 

    col1 col2 col3 
0 a b NaN 

Таким образом, это дает нам строки, которые будут удалены, если мы опустим строки с помощью Nans в интересующих столбцах. Чтобы сохранить столбцы, мы можем запустить тот же код, но использовать ~, чтобы инвертировать выделение

df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)] 

    col1 col2 col3 
1 NaN c c 
2 c d a 

это эквивалентно:

df.dropna(subset=['col2', 'col3']) 

Что мы можем проверить:

df.dropna(subset=['col2', 'col3']).equals(df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)]) 

True 

Вы можете, конечно, проверить это на своих собственных более крупных кадрах данных, но должны получить тот же ответ.

Смежные вопросы