본문 바로가기
self.python

[python] 데이터프레임 조건에 맞는 행 index 뽑아오기 - index

by 톤토니 2022. 5. 30.
반응형

 

 

데이터프레임 조건에 맞는 행 index 뽑아오기 - index

 

데이터 프레임에서 조건에 맞는 행의 index를 뽑아오는 방법은 바로 .index를 붙이면 된다.

바로 전 글에서 isin을 사용해서 데이터 프레임에서 값으로 행을 추출하는 방법에 대해 설명했는데

2022.05.30 - [self.python] - [python] 데이터프레임 조건에 맞는 행 index 뽑아오기

 

그 바로 뒤에 .index를 붙이면 그 조건을 만족하는 행의 인덱스를 알 수 있다.

 

보통 이렇게 쓰는 경우는 그 조건에 부합하는 행을 삭제하기 위해서 사용하는 경우가 많은 것 같다.

 

isin() 을 사용해서 조건에 맞는 행을 뽑아내고 바로 drop을 하면 에러가 나게 된다.

drop함수 안에는 index를 써야 제대로 drop이 된다.

 

 

 

1. 데이터 프레임 준비

 

import numpy as np
import pandas as pd

score = {'Year' : ['2016', '2017', '2018', '2019', '2020', '2021', '2022'],
            'Mary': [90, 68, 70, 80, 92, 68, 78],
            'Kate': [90, 68, 70, 80, 92, 68, 78],
            'Mark': [39, 59, 60, 73, 84, 87, 92],
            'Maxi': [83, 92, 71, 56, 79, 93, 85],
            'Jess': [np.nan,0, 0, 0, 44, 74, 49]}

df = pd.DataFrame(score)
df

 

이전에 사용했던 데이터 프레임을 재활용 하는 것이다. 임의의 데이터 프레임 df는 2016 ~ 2022년도 각 학생의 점수를 나타낸 것이라 하자.

 

 


 

2. 원하는 조건 뽑아내기

 

isin() 함수로 원하는 조건의 행을 뽑을 수 있다. 예를들어 Mary 라는 학생이 68점, 70점 맞았을 때의 행을 가져온다고 하자.

물론, isin 말고도 여러 방법이 있다.

 

df[df['Mary'].isin([68, 70])]

조건에 맞는 행이 나왔다.

 

 

3. 지우기

 

여기서 이 행들을 지우고 싶은데, 바로 drop을 쓴다면 ? 

 

df_del = df.drop(df[df['Mary'].isin([68, 70])])
df_del

```

 

이렇게 err가 발생한다.

 

 

 

df_del = df.drop(df[df['Mary'].isin([68, 70])].index)
df_del

 

이렇게 index로 지워주면(1, 2, 5번 인덱스) 해당 행이 모두 지워진 것을 볼 수 있다.

 

지워진 index를 빼고 index를 초기화 하고 싶다면?

 

df_del = df.drop(df[df['Mary'].isin([68, 70])].index).reset_index(drop=True)
df_del

 

저번 글 처럼 reset_index(drop = True) 를 써주면 된다.

 

 

 

총 정리

 

import numpy as np
import pandas as pd

score = {'Year' : ['2016', '2017', '2018', '2019', '2020', '2021', '2022'],
            'Mary': [90, 68, 70, 80, 92, 68, 78],
            'Kate': [90, 68, 70, 80, 92, 68, 78],
            'Mark': [39, 59, 60, 73, 84, 87, 92],
            'Maxi': [83, 92, 71, 56, 79, 93, 85],
            'Jess': [np.nan,0, 0, 0, 44, 74, 49]}

df = pd.DataFrame(score)

df_del = df.drop(df[df['Mary'].isin([68, 70])].index).reset_index(drop=True)
df_del

 

 

* 참고

df[df['Mary'].isin([68, 70])].index
# Int64Index([1, 2, 5], dtype='int64')

 

 

반응형

댓글