반응형
질문
주어진 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]
는 df
의 i
번째 행을 반환합니다. 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
반응형
댓글