다음과 같은 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
NaN이있는 행의 “정수”인덱스를 찾는 효율적인 방법이 있습니까? 이 경우 원하는 출력은 [3, 6]
.
답변
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]
답변
다음은 더 간단한 해결책입니다.
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])
답변
한 줄 솔루션. 그러나 한 열에서만 작동합니다.
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]))
답변
다음은 몇 가지 방법에 대한 테스트입니다.
%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]
타이밍 측면에서 승리하는 것처럼 보이지만 상위 세 가지 방법 중 어느 것이 든 비슷한 성능을 보입니다 .
답변
날짜 시간 인덱스가 있고 값이 필요한 경우 :
df.loc[pd.isnull(df).any(1), :].index.values