파이썬 인덱스 추출 - paisseon indegseu chuchul

데이터프레임 조건에 맞는 행 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
파이썬 인덱스 추출 - paisseon indegseu chuchul

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


2. 원하는 조건 뽑아내기

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

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

df[df['Mary'].isin([68, 70])]
파이썬 인덱스 추출 - paisseon indegseu chuchul

조건에 맞는 행이 나왔다.

3. 지우기

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

df_del = df.drop(df[df['Mary'].isin([68, 70])])
df_del
파이썬 인덱스 추출 - paisseon indegseu chuchul

```

이렇게 err가 발생한다.


df_del = df.drop(df[df['Mary'].isin([68, 70])].index)
df_del
파이썬 인덱스 추출 - paisseon indegseu chuchul

이렇게 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')

enumerate함수를 사용하면 리스트의 요소와 인덱스를 같이 가져올 수 있다.

a = ['one', 'two', 'three']
list(enumerate(a))
>>>[(0, 'one'), (1, 'two'), (2, 'three')]

enumerate를 사용하면 순서를 0번부터 붙여주는 것을 확인할 수 있습니다.

enumerate에서 값을 튜플 형식으로 인덱스 값과 리스트의 변수 값을 가져오는 것을 확인할 수 있습니다.

# 리스트의 요소와 인덱스를 가져오기
a = ['one', 'two', 'three']
for index in range(len(a)):
    print(index, a[index])

>>>    
0 one
1 two
2 three


# enumerate 함수를 사용한 방법
a = ['one', 'two', 'three']
for index, value in enumerate(a):
    print(index, value)

>>>    
0 one
1 two
2 three

둘 다 같은 결과를 출력하는 방식입니다. enumerate를 사용하면 리스트에 값을 직접 넣지 않고 변수값을 바로 받아올 수 있어서 편리합니다.

파이썬 인덱스 추출 - paisseon indegseu chuchul
for x in enumerate('ABCDE', start=65):
    print(x)

>>>
(65, 'A')
(66, 'B')
(67, 'C')
(68, 'D')
(69, 'E')

문자열에서도 동일하게 사용할 수 있습니다.

또한 start 값을 지정하여서 index값의 시작지점을 설정할 수 있습니다.

index 함수는 배열에서 값의 위치를 찾아주는 함수리며, 중복된 값이 있으면 가장 최소의 위치를 리턴


a 리스트에서 10의 위치 찾기. (최소값인 1이 출력)

a = [11,10,12,13,20,31,11,10,10,11]
print(a.index(10))
-----------------------------------
1

a 리스트에서 2번째 ~ 9번째 위치에서 10의 위치 찾기. (최소값인 7이 출력)

a = [11,10,12,13,20,31,11,10,10,11]
print(a.index(10,2,9))    # index(value, start, end)
----------------------------------------------------
7

a 문자열에 '1' 이라는 문자 위치 찾기

a = '123451'
print(a.index('1'))
---------------------
0

a 문자열에 1번째 ~ 6번째 위치에서 '1' 이라는 문자 위치 찾기

a = '123451'
print(a.index('1',1,6))
------------------------
5