본문 바로가기
Python/Python FAQ

Python 파이썬 판다스: 특정 값과 일치하는 열의 행 인덱스 가져오기, Python Pandas: Get index of rows where column matches certain value

by 베타코드 2023. 10. 11.
반응형

질문


주어진 DataFrame에 "BoolCol"이라는 열이 있는 경우, "BoolCol" 값이 True인 DataFrame의 인덱스를 찾고 싶습니다.

현재는 작동하는 반복적인 방법을 사용하고 있습니다:

for i in range(100,3000):
    if df.iloc[i]['BoolCol']== True:
         print i,df.iloc[i]['BoolCol']

하지만 이는 올바른 판다스 방법이 아닙니다. 조사를 한 후, 현재 이 코드를 사용하고 있습니다:

df[df['BoolCol'] == True].index.tolist()

이 코드는 인덱스의 리스트를 제공하지만, 확인해 보면 일치하지 않습니다:

df.iloc[i]['BoolCol']

결과는 실제로 False입니다!!

이를 올바르게 수행하는 판다스 방법은 무엇일까요?


답변


df.iloc[i]dfi번째 행을 반환합니다. i는 인덱스 라벨을 참조하는 것이 아니라 0을 기준으로 하는 인덱스입니다.

반면에, 속성 index는 숫자 행 인덱스가 아닌 실제 인덱스 라벨을 반환합니다:

df.index[df['BoolCol'] == True].tolist()

또는 동등하게,

df.index[df['BoolCol']].tolist()

행의 숫자 위치와 다른 기본 인덱스가 있는 DataFrame을 사용하여 차이를 명확하게 볼 수 있습니다:

df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
       index=[10,20,30,40,50])

In [53]: df
Out[53]: 
   BoolCol
10    True
20   False
30   False
40    True
50    True

[5 rows x 1 columns]

In [54]: df.index[df['BoolCol']].tolist()
Out[54]: [10, 40, 50]

인덱스를 사용하려면,

In [56]: idx = df.index[df['BoolCol']]

In [57]: idx
Out[57]: Int64Index([10, 40, 50], dtype='int64')

그런 다음 iloc 대신 loc를 사용하여 행을 선택할 수 있습니다:

In [58]: df.loc[idx]
Out[58]: 
   BoolCol
10    True
40    True
50    True

[3 rows x 1 columns]

loc는 boolean 배열도 허용합니다:

In [55]: df.loc[df['BoolCol']]
Out[55]: 
   BoolCol
10    True
40    True
50    True

[3 rows x 1 columns]

boolean 배열 mask가 있고 순서 인덱스 값을 필요한 경우, np.flatnonzero를 사용하여 계산할 수 있습니다:

In [110]: np.flatnonzero(df['BoolCol'])
Out[112]: array([0, 3, 4])

순서 인덱스에 따라 행을 선택하려면 df.iloc을 사용하세요:

In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
Out[113]: 
   BoolCol
10    True
40    True
50    True
반응형

댓글