Mam takie pandy 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
Czy istnieje skuteczny sposób na znalezienie „całkowitego” indeksu wierszy z NaN? W takim przypadku pożądane wyjście powinno być [3, 6]
.
df[np.isnan(df['b'])]
numpy
'sisnan
, możesz również użyćdf['b'].isnull()
Odpowiedzi:
Dla DataFrame
df
:import numpy as np index = df['b'].index[df['b'].apply(np.isnan)]
zwróci Ci dane
MultiIndex
, których możesz użyć do indeksowania z powrotemdf
, np .:df['a'].ix[index[0]] >>> 1.452354
Dla indeksu liczb całkowitych:
df_index = df.index.values.tolist() [df_index.index(i) for i in index] >>> [3, 6]
źródło
ix
brzmi, z pewnych powodów brzmi, jakby został wycofany na korzyśćiloc
Oto prostsze rozwiązanie:
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])
źródło
np.where(df['b'].notnull())[0]
.nonzero()[0]
jest lepsze niż[i for i, k in enumerate(mask) if k]
.)r, _ = np.where(df.isna())
.to_numpy()
najpierw do konwersji w tablicy numpy -pd.isnull(df).any(1).to_numpy().nonzero()
Rozwiązanie jednoprzewodowe. Jednak działa tylko dla jednej kolumny.
df.loc[pandas.isna(df["b"]), :].index
źródło
list(...)
taki sposób:list(df.loc[pandas.isna(df["b"]), :].index)
I na wszelki wypadek, jeśli zamiast tego chcesz znaleźć współrzędne „nan” dla wszystkich kolumn (zakładając, że wszystkie są liczbami), proszę bardzo:
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]))
źródło
Nie wiem, czy jest już za późno, ale możesz użyć np.where, aby znaleźć indeksy innych niż wartości jako takie:
indices = list(np.where(df['b'].isna()[0]))
źródło
w przypadku, gdy masz indeks datetime i chcesz mieć wartości:
df.loc[pd.isnull(df).any(1), :].index.values
źródło
Oto testy kilku metod:
%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
I odpowiadające im czasy:
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)
Wydawałoby się, że
pd.isnull(df['DRGWeight']).nonzero()[0]
wygrywa dzień pod względem czasu, ale każda z trzech najlepszych metod ma porównywalną wydajność.źródło
Innym prostym rozwiązaniem jest
list(np.where(df['b'].isnull())[0])
źródło
Oto kolejne prostsze podejście:
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))
źródło
Szukałem wszystkich indeksów wierszy z wartościami NaN.
Moje rozwiązanie robocze:
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)]
źródło
Niech ramka danych zostanie nazwana df, a interesująca nas kolumna (tj . Kolumna, w której próbujemy znaleźć wartości null ) to „b” . Następnie poniższy fragment kodu podaje żądany indeks o wartości null w ramce danych:
for i in range(df.shape[0]): if df['b'].isnull().iloc[i]: print(i)
źródło