Pandas 데이터 프레임에서 NaN으로 행의 정수 인덱스 찾기


94

다음과 같은 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].


12
nan으로 행만 선택하려면 할 수 있습니다df[np.isnan(df['b'])]
lazy1

4
@ lazy1의 후속 조치- numpy' 를 사용하는 대신 isnan사용할 수 있습니다.df['b'].isnull()
jmetz

답변:


46

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]

1
직관적으로 ix이 된 것 같은데, 어떤 이유로 들린다 되지 찬성iloc
카 다몬

145

다음은 더 간단한 해결책입니다.

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])

29
나는 이것을 사용하여 끝났다 :np.where(df['b'].notnull())[0]

덕분에, .nonzero()[0]더 나은보다 [i for i, k in enumerate(mask) if k]).
Winand

2
더 단순화 할 수 있습니다.r, _ = np.where(df.isna())
cs95

2
.to_numpy()먼저 numpy 배열로 변환하기 위해 추가pd.isnull(df).any(1).to_numpy().nonzero()
7bStan

13

한 줄 솔루션. 그러나 한 열에서만 작동합니다.

df.loc[pandas.isna(df["b"]), :].index

이것이 제가 찾던 것입니다. 다음 list(...)과 같이 포장하여 목록으로 만들었습니다 .list(df.loc[pandas.isna(df["b"]), :].index)
Daniel Butler

10

그리고 만약을 대비하여 모든 열에 대해 '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]))

9

이것이 너무 늦었는지 모르지만 np.where를 사용하여 다음과 같이 비 값의 인덱스를 찾을 수 있습니다.

indices = list(np.where(df['b'].isna()[0]))

4

다음은 몇 가지 방법에 대한 테스트입니다.

%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]타이밍 측면에서 승리하는 것처럼 보이지만 상위 세 가지 방법 중 어느 것이 든 비슷한 성능을 보입니다 .


3

날짜 시간 인덱스가 있고 값이 필요한 경우 :

df.loc[pd.isnull(df).any(1), :].index.values


1

다음은 또 다른 간단한 방법입니다.

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))

1

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)]

0

데이터 프레임의 이름을 df 로 지정 하고 관심있는 열 (즉 , null을 찾으려고하는 열 )을 'b'로 지정 합니다. 그런 다음 다음 스 니펫은 데이터 프레임에서 원하는 null 색인을 제공합니다.

   for i in range(df.shape[0]):
       if df['b'].isnull().iloc[i]:
           print(i)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.