Найти целочисленный индекс строк с 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].
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