У меня есть 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
Есть ли эффективный способ найти "целочисленный" индекс строк с NaN? В этом случае желаемый результат должен быть [3, 6]
.
df[np.isnan(df['b'])]
numpy
'sisnan
вы также можете использоватьdf['b'].isnull()
Ответы:
Для DataFrame
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]
источник
ix
звучало, по некоторым причинам это звучит так, будто оно устарело в пользуiloc
Вот более простое решение:
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])
источник
np.where(df['b'].notnull())[0]
.nonzero()[0]
лучше чем[i for i, k in enumerate(mask) if k]
.)r, _ = np.where(df.isna())
.to_numpy()
сначала добавить, чтобы преобразовать в массив numpy -pd.isnull(df).any(1).to_numpy().nonzero()
Однострочное решение. Однако это работает только для одного столбца.
df.loc[pandas.isna(df["b"]), :].index
источник
list(...)
примерно так:list(df.loc[pandas.isna(df["b"]), :].index)
И на всякий случай, если вы хотите вместо этого найти координаты 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]))
источник
Не знаю, слишком ли поздно, но вы можете использовать np.where, чтобы найти индексы не-значений как таковых:
indices = list(np.where(df['b'].isna()[0]))
источник
в случае, если у вас есть индекс datetime и вы хотите иметь значения:
df.loc[pd.isnull(df).any(1), :].index.values
источник
Вот тесты для нескольких методов:
%timeit np.where(np.isnan(df['b']))[0] %timeit pd.isnull(df['b']).nonzero()[0] %timeit np.where(df['b'].isna())[0] %timeit df.loc[pd.isna(df['b']), :].index
И их соответствующие тайминги:
333 µs ± 9.95 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 280 µs ± 220 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each) 313 µs ± 128 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each) 6.84 ms ± 1.59 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Казалось бы, это
pd.isnull(df['DRGWeight']).nonzero()[0]
выигрывает день с точки зрения времени, но любой из трех лучших методов имеет сопоставимую производительность.источник
Еще одно простое решение:
list(np.where(df['b'].isnull())[0])
источник
Вот еще один более простой вариант:
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))
источник
Я искал все индексы строк со значениями 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)]
источник
Пусть фрейм данных будет называться df, а интересующий столбец (т. Е. Столбец, в котором мы пытаемся найти нули ) - «b» . Затем следующий фрагмент дает желаемый индекс нуля в фрейме данных:
for i in range(df.shape[0]): if df['b'].isnull().iloc[i]: print(i)
источник