Найдите пустую или NaN-запись в Pandas Dataframe

Я пытаюсь выполнить поиск через Pandas Dataframe, чтобы найти там, где у него отсутствует запись или запись NaN.

Вот кадр данных, с которым я работаю:

cl_id            a           c         d         e        A1              A2             A3
    0            1   -0.419279  0.843832 -0.530827    text76        1.537177      -0.271042
    1            2    0.581566  2.257544  0.440485    dafN_6        0.144228       2.362259
    2            3   -1.259333  1.074986  1.834653    system                       1.100353
    3            4   -1.279785  0.272977  0.197011     Fifty       -0.031721       1.434273
    4            5    0.578348  0.595515  0.553483   channel        0.640708       0.649132
    5            6   -1.549588 -0.198588  0.373476     audio       -0.508501               
    6            7    0.172863  1.874987  1.405923    Twenty             NaN            NaN
    7            8   -0.149630 -0.502117  0.315323  file_max             NaN            NaN

ПРИМЕЧАНИЕ. Пустые записи - это пустые строки - это связано с тем, что в файле не было алфавитно-цифрового содержимого, из которого произошел фреймворк.

Если у меня есть этот фреймворк данных, как я могу найти список с индексами, в которых происходит NaN или пустая запись?

Ответ 1

np.where(pd.isnull(df)) возвращает индексы строк и столбцов, где значение NaN:

In [152]: import numpy as np
In [153]: import pandas as pd
In [154]: np.where(pd.isnull(df))
Out[154]: (array([2, 5, 6, 6, 7, 7]), array([7, 7, 6, 7, 6, 7]))

In [155]: df.iloc[2,7]
Out[155]: nan

In [160]: [df.iloc[i,j] for i,j in zip(*np.where(pd.isnull(df)))]
Out[160]: [nan, nan, nan, nan, nan, nan]

Поиск значений, которые являются пустыми строками, может быть выполнено с помощью applymap:

In [182]: np.where(df.applymap(lambda x: x == ''))
Out[182]: (array([5]), array([7]))

Обратите внимание, что использование applymap требует вызова функции Python один раз для каждой ячейки DataFrame. Это может быть медленным для большого DataFrame, поэтому было бы лучше, если бы вы могли организовать для всех пустых ячеек вместо NaN, чтобы вы могли использовать pd.isnull.

Ответ 2

Попробуй это:

df[df['column_name'] == ''].index

а для NaNs вы можете попробовать:

pd.isna(df['column_name'])

Ответ 3

Частичное решение: для столбца с одной строкой tmp = df['A1'].fillna(''); isEmpty = tmp==''  дает boolean Series True, где есть пустые строки или значения NaN.

Ответ 4

Я прибегал к

df[ (df[column_name].notnull()) & (df[column_name]!=u'') ].index

недавно. Это получает как пустые, так и пустые ячейки за один раз.

Ответ 5

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

DF_new_row=DF_raw.loc[DF_raw['columnname']=='']

Это даст подмножество DF_raw, которое удовлетворяет условию проверки.