Saya memiliki DataFrame panda seperti ini:
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
Apakah ada cara yang efisien untuk menemukan indeks "integer" dari baris dengan NaN? Dalam hal ini output yang diinginkan harus [3, 6]
.
df[np.isnan(df['b'])]
numpy
,isnan
Anda juga dapat menggunakandf['b'].isnull()
Jawaban:
Untuk DataFrame
df
:import numpy as np index = df['b'].index[df['b'].apply(np.isnan)]
akan memberi Anda kembali
MultiIndex
yang dapat Anda gunakan untuk mengindeks kembalidf
, misalnya:df['a'].ix[index[0]] >>> 1.452354
Untuk indeks integer:
df_index = df.index.values.tolist() [df_index.index(i) for i in index] >>> [3, 6]
sumber
ix
kedengarannya, untuk beberapa alasan kedengarannya seperti sudah ditinggalkan demiiloc
Berikut adalah solusi yang lebih sederhana:
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])
sumber
np.where(df['b'].notnull())[0]
.nonzero()[0]
lebih baik dari[i for i, k in enumerate(mask) if k]
.)r, _ = np.where(df.isna())
.to_numpy()
untuk mengonversi dalam array numpy terlebih dahulu -pd.isnull(df).any(1).to_numpy().nonzero()
Solusi satu baris. Namun ini bekerja hanya untuk satu kolom.
df.loc[pandas.isna(df["b"]), :].index
sumber
list(...)
seperti ini:list(df.loc[pandas.isna(df["b"]), :].index)
Dan untuk berjaga-jaga, jika Anda ingin mencari koordinat 'nan' untuk semua kolom (anggap saja semuanya numerik), ini dia:
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]))
sumber
Tidak tahu apakah ini terlambat tetapi Anda dapat menggunakan np.where untuk menemukan indeks non nilai seperti:
indices = list(np.where(df['b'].isna()[0]))
sumber
jika Anda memiliki indeks datetime dan Anda ingin memiliki nilai:
df.loc[pd.isnull(df).any(1), :].index.values
sumber
Berikut adalah tes untuk beberapa metode:
%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
Dan pengaturan waktu yang sesuai:
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)
Tampaknya
pd.isnull(df['DRGWeight']).nonzero()[0]
memenangkan hari dalam hal waktu, tetapi salah satu dari tiga metode teratas memiliki kinerja yang sebanding.sumber
Solusi sederhana lainnya adalah
list(np.where(df['b'].isnull())[0])
sumber
Berikut ini pandangan lain yang lebih sederhana:
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))
sumber
Saya mencari semua indeks baris dengan nilai NaN.
Solusi kerja saya:
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)]
sumber
Biarkan kerangka data diberi nama df dan kolom yang diinginkan (yaitu kolom di mana kami mencoba untuk menemukan nulls ) adalah 'b' . Kemudian cuplikan berikut memberikan indeks null yang diinginkan di dataframe:
for i in range(df.shape[0]): if df['b'].isnull().iloc[i]: print(i)
sumber