Как определить строки с NaN только в некотором подмножестве столбцов? - PullRequest
0 голосов
/ 14 ноября 2018

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

Я считаю, что должно работать следующее ...

my_df.query('colA.isnull() | colZ.isnull() | colN.isnull()')

Однако я сталкиваюсь со следующим исключением

TypeError: unhashable type: 'numpy.ndarray'

Теперь я определил, что могу передать параметр engine='python', чтобы запрос работал.Но я бы хотел использовать оптимизированный движок numexpr.

Возможно ли такой запрос?Или мне нужно перебирать каждый столбец, по которому я хочу фильтровать, по одному за раз?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете нарезать столбцы и использовать df.isna().

df (сгенерированный с использованием кода, который я сегодня скопировал откуда-то еще на SO ранее, извините, я забыл куда, но спасибо!):

          0         1         2         3         4
0  0.763847  1.343149  0.096778       NaN  0.532322
1 -0.364227 -0.560027       NaN       NaN       NaN
2 -0.556234  0.384970  0.476016       NaN -0.385282
3  0.604560 -0.390024 -1.697762  1.207321  0.829520
4       NaN       NaN  0.754011  2.137359 -0.594698
5  0.513925  0.651509 -1.500094       NaN -0.556604
6       NaN       NaN -1.388030       NaN       NaN
7       NaN -0.634743  0.024213 -0.439684  0.765820
8  0.815948  0.545350 -0.823986       NaN  1.655538
9  0.687386  1.477326       NaN  0.207531  0.571499

вывод df.isna():

       0      1      2      3      4
0  False  False  False   True  False
1  False  False   True   True   True
2  False  False  False   True  False
3  False  False  False  False  False
4   True   True  False  False  False
5  False  False  False   True  False
6   True   True  False   True   True
7   True  False  False  False  False
8  False  False  False   True  False
9  False  False   True  False  False

Операции со строками:

df.isna().sum(axis=1)
0    1
1    3
2    1
3    0
4    2
5    1
6    4
7    1
8    1
9    1

По столбцам:

df.isna().sum()
    0    3
    1    2
    2    2
    3    6
    4    2

Для нарезкиdf, используйте что-то вроде df.loc[:, 0:2].isna().Вы можете прочитать о нарезке, .loc и .iloc здесь: https://pandas.pydata.org/pandas-docs/stable/indexing.html

0 голосов
/ 14 ноября 2018

Один из подходов состоит в создании логической маски, которая выбирает строки, для которых выполняется любое из ваших условий.

# Method 1: build the boolean mask using bitwise operations
 mask = ((df['colA'].isnull()) |
         (df['colZ'].isnull()) | 
         (df['colN'].isnull()))
null_rows = df[mask]

# Method 2: pick desired columns from an element-wise boolean mask of null flags
mask = df.isnull()[['colA', 'colZ', 'colN']].any(axis=1)
null_rows = df[mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...