[pandas] 열 또는 행 선택하기

파이썬 라이브러리 pandas로 데이터 프레임의 열과 행을 다루는 방법에 대해 정리했다.

열 1개 선택하기

예를 들어 df라는 데이터 프레임이 아래와 같이 있을 때

여기서 age 열만 선택하고 싶다면 방법은 두 가지다.

1) df.[‘column_name’]

딕셔너리에서 key를 선택해 value를 불러오는 것처럼 할 수 있다.

age = df['age']

2) df.column_name

아니면 점을 찍고 열 이름을 써서 바로 불러올 수도 있다.

age = df.age

단, 이 방법에서는 열 이름이 숫자로 시작하지 않고 공백이나 특수 문자 등을 포함하지 않는 등의 조건을 만족해야 한다.

2번 방법이 스크립트 간결성 측면에서 더 좋지만, 그러려면 애초에 열 이름이 잘 입력되었는지 확인해보고 아닌 경우에는 조건에 맞도록 바꿔주어야 한다.

복잡하니 1번으로 쓰면 된다.


열 여러개 선택하기

특정 열을 여러개 선택하는 건 곧 기존 데이터 프레임 중 특정 열만 선택해서 간추린 새로운 데이터 프레임을 만든다는 뜻이기도 하다.

예를 들어 df라는 데이터 프레임이 아래와 같이 있을 때

여기서 last_name과 email만 가져오고 싶다면

new_df = df[['last_name', 'email']]

이렇게 새로운 데이터 프레임 new_df를 만들면 된다.

리스트의 리스트 형태로 불러오는 것에 주의하자.


행 선택하기 (인덱스 활용)

예를 들어 df라는 데이터 프레임이 아래와 같이 있을 때

id가 91978인 Joyce Waller 라는 사람의 행을 가져오고 싶다고 해보자.

그럼 이렇게 하면 된다.

df.iloc[2]

iloc 이후에 붙은 숫자 2는 (위에서 0부터 셀 때) 2번째 행이라는 뜻이다. i는 integer라고 생각하면 기억하기 쉽다. integer 기반의 인덱싱을 한다는 의미이다.

여러개 행을 선택하는 것도 마찬가지 인덱싱의 원리다. 예를 들어 3~6번째 행까지 가져오고 싶다면 된다.

df.iloc[3:7]

0~4번째 행까지 가져오고 싶다면 이렇게. (df.head()와 같다.)

df.iloc[:5]

맨 마지막 행부터 5개만 가져오고 싶다면 이렇게. (df.tail()과 같다.)

df.iloc[:-5]

행 선택하기 (조건 활용)

예를 들어 df라는 데이터 프레임이 아래와 같이 있을 때 어떤 열에서 특정 조건을 만족하는 행만 가져오고 싶다고 하자.

age가 30 이상인 행만 가져오고 싶다면

df[df['age']>=30]
# df[df.age>=30]

name이 ‘Clara Oswald’가 아닌 경우만 선택하고 싶다면

df[df['name'] != 'Clara Oswald']
# df[df.name != 'Clara Oswald']

age가 30 미만이고 name이 ‘Martha Jones’인 경우만 선택하고 싶다면

df[(df['age'] < 30) | (df['name']=='Martha Jones')]
# df[(df.age < 30) | (df.name == 'Martha Jones')]

|는 or,  &는 and의 의미다.


isin()과 리스트 활용하기

.isin() 안에 리스트를 넣어두고, 그 리스트에 해당하는 값이 있는 행만 찾는 방식도 가능하다.

예를 들어 name이 ‘Martha Jones’, ‘Rose Tyler’, ‘Amy Pond’ 중에 해당하는 경우를 선택하고 싶다면

df[df[‘name’].isin(['Martha Jones', 'Rose Tyler', 'Amy Pond'])]
# df[df.name.isin(['Martha Jones', 'Rose Tyler', 'Amy Pond'])]

행 선택 후 인덱스 리셋하기

기존 데이터 프레임에서 특정 행만 선택하면 기존의 인덱스를 그대로 유지한다.

예를 들어 df에서 특정 행만 선택해 df2로 가져오면 이런 모양새다.

그래서 나중에 인덱스를 활용해서 데이터를 처리할 때 곤란해진다.

이때 reset_index()를 사용하면 인덱스를 리셋할 수 있다.

df3 = df2.reset_index()

인덱스가 리셋된다.

그런데 여기서 문제가 있다. 리셋된 index가 자동으로 데이터 프레임에 자료로 포함되는 것이다. 이를 방지하려면 drop=True를 사용하면 된다.

df3 = df2.reset_index(drop=True)

reset_index()는 새로운 데이터 프레임으로 불러오는 것이기 때문에 이를 다른 변수에 저장해야 한다. 만약 그냥 기존 데이터 프레임을 덮어 쓰고 싶다면 inplace=True를 사용하면 된다. (새로운 데이터 프레임을 만들지 않고 인덱스만 리셋하는 가장 깔끔한 방법은 이거다.)

df2.reset_index(inplace=True, drop=True)

추천 글

댓글 남기기