Я собирался оставить комментарий, но решил, что напишу ответ, поскольку он начал становиться довольно сложным. Начнем с следующего кадра данных:
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
Вы можете, конечно, проверить это на своих собственных более крупных кадрах данных, но должны получить тот же ответ.
Мне очень нравится это решение. Обратите внимание, что '-' устарел в пользу' ~ '. – johnchase