Найти целочисленный индекс строк с NaN в фрейме данных pandas



У меня есть панда DataFrame, как это:



                    a         b
2011-01-01 00:00:00 1.883381 -0.416629
2011-01-01 01:00:00 0.149948 -1.782170
2011-01-01 02:00:00 -0.407604 0.314168
2011-01-01 03:00:00 1.452354 NaN
2011-01-01 04:00:00 -1.224869 -0.947457
2011-01-01 05:00:00 0.498326 0.070416
2011-01-01 06:00:00 0.401665 NaN
2011-01-01 07:00:00 -0.019766 0.533641
2011-01-01 08:00:00 -1.101303 -1.408561
2011-01-01 09:00:00 1.671795 -0.764629


есть ли эффективный способ найти "целочисленный" индекс строк с NaNs? В этом случае желаемый результат должен быть [3, 6].

646   6  

6 ответов:

Для Фрейма Данных df:

import numpy as np
index = df['b'].index[df['b'].apply(np.isnan)]

вернет вам MultiIndex что вы можете использовать для индексирования обратно в df, например:

df['a'].ix[index[0]]
>>> 1.452354

для целочисленного индекса:

df_index = df.index.values.tolist()
[df_index.index(i) for i in index]
>>> [3, 6]

вот более простое решение:

inds = pd.isnull(df).any(1).nonzero()[0]

In [9]: df
Out[9]: 
          0         1
0  0.450319  0.062595
1 -0.673058  0.156073
2 -0.871179 -0.118575
3  0.594188       NaN
4 -1.017903 -0.484744
5  0.860375  0.239265
6 -0.640070       NaN
7 -0.535802  1.632932
8  0.876523 -0.153634
9 -0.686914  0.131185

In [10]: pd.isnull(df).any(1).nonzero()[0]
Out[10]: array([3, 6])

и на всякий случай, если вы хотите найти координаты 'nan' для всех столбцов вместо этого (предположим, что они все числовые), здесь вы идете:

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

df
   0  1  2    3    4  5
0  0  1  3  4.0  NaN  2
1  3  5  6  NaN  3.0  3

np.where(np.asanyarray(np.isnan(df)))
(array([0, 1]), array([4, 3]))

вот еще один простой дубль:

df = pd.DataFrame([[0,1,3,4,np.nan,2],[3,5,6,np.nan,3,3]])

inds = np.asarray(df.isnull()).nonzero()

(array([0, 1], dtype=int64), array([4, 3], dtype=int64))

Не знаю, если это слишком поздно, но вы можете использовать NP.где найти индексы не значений как таковые:

indices = np.where(df['b'].isna())

Я искал все индексы строк со значениями NaN.
Мое рабочее решение:

def get_nan_indexes(data_frame):
    indexes = []
    print(data_frame)
    for column in data_frame:
        index = data_frame[column].index[data_frame[column].apply(np.isnan)]
        if len(index):
            indexes.append(index[0])
    df_index = data_frame.index.values.tolist()
    return [df_index.index(i) for i in set(indexes)]

Comments

    Ничего не найдено.