[Python](Pandas) 데이터 가공-2 : DataFrame의 행과 열 추출하기, 그리고 .loc[]
이번 글에서는 DataFrame의 행(Row)과 열(Column)을 추출하는 방법에 대해 알아볼 것이다.
이하 예제에는 이전 글에서 만든 DataFrame인, zoo_df를 이용하도록 한다.
링크 : https://kongalmengi.tistory.com/19
[Python](Pandas) 데이터 가공 연습-1 : DataFrame에 새로운 Column 추가하기
DataFrame에 새로운 Column 추가하기. 사실 이는 앞의 글에서 예제에 사용한 데이터 프레임 st_df를 만들 때 자연스럽게 했던 과정이다. 이번에는 이를 다시 한 번 연습해본다는 느낌으로 접근해보자.
kongalmengi.tistory.com
해당 글에서 만든 zoo_df를 불러오자
zoo_df
이제 해당 DataFrame의 행과 열을 추출하는 방법에 대해 하나씩 알아보자.
기본적으로 리스트의 인덱싱과 비슷한 방법을 이용하여 아래와 같이 Column을 추출할 수 있다.
zoo_df['이름']
0 더 그레이트
1 더 울트라
2 쪼꼬미
3 검은꼬리
4 코뿌리
5 얼룩이
6 바닥이
7 뽀삐
8 뽀미
9 물먹는하마
Name: 이름, dtype: object
결과물의 데이터형은 Series다.
문제는 Series 데이터형의 경우에는 1개의 Column만 보여줄 수 있다는 점이다. 그때문에 여러 개의 Column을 보여주고자 한다면, 위의 방법으로는 에러가 난다.
그러므로 여러 개의 Column을 보여주고자 한다면 Series가 아닌 DataFrame으로 출력해줘야 한다.
그렇다면 어떻게 해야 DataFrame의 결과물을 얻을 수 있을까?
어렵지 않다. 아래와 같이 그냥 대괄호를 하나 더 써주면 된다.
zoo_df[['이름']]
정말 DataFrame 형태를 유지하고 있는 것을 확인할 수 있다.
※ 참고 : 데이터형을 제대로 확인하고자 한다면 type()을 이용해서 확인해야 하지만, 여기서는 생략하도록 한다.
그럼 위의 방법을 이용하여 여러 개의 Column을 추출해보자.
zoo_df[['이름', '키(cm)']]
DataFrame 형태로 Column을 추출하니, 정말로 에러 없이 정상적으로 추출되었다.
이번에는 특정 행을 추출하는 방법에 대해 살펴볼 것이다.
zoo_df에 대해, 특정 인덱스 범위의 행을 추출하는 방법은 기본적으로 아래와 같다.
- zoo_df[시작 인덱스 : 끝 인덱스 +1]
위의 방법에 따라 index 3번 부터 6번 까지의 행을 추출하고자 한다면, 아래와 같이 코드를 구성하면 된다.
zoo_df[3:7]
i) 단일 조건식-1
인덱스를 이용하지 않고, 조건식을 이용하여 특정 행을 추출할 수도 있다.
예를 들어 키가 200보다 큰 친구들에 대한 정보를 추출(행 추출)하고자 하는 경우에는 아래와 같이 할 수 있다.
zoo_df[zoo_df['키(cm)']>200]
ii) 단일 조건식-2
마찬가지 방법으로, 밥 추가가 필요한 친구들에 대한 정보를 추출하고자 하는 경우에도 아래와 같이 할 수 있다.
zoo_df[zoo_df['밥 추가'] == '밥 추가 필요']
iii) 복합 조건식
또한, 조건식을 and나 or 연산자를 이용하여 복합적으로 적용할 수도 있다.
예를 들어, '비고' 항목에서 '재공사 요망'에 해당되거나, 혹은 '종류'가 '흰꼬리사슴'인 경우 중, 하나라도 만족하는 경우를 찾아보자면 아래와 같이 찾을 수 있다.
zoo_df[(zoo_df['비고'] == '재공사 요망') | (zoo_df['종류'] == '흰꼬리사슴')]
위의 코드를 통해 종류가 '흰꼬리사슴'이거나, 혹은 비고 사항에 '재공사 요망'인 경우 중 하나라도 만족하는 경우를 모두 추출 하였다.
여기서 사소한 주의사항으로는, 조건들을 괄호로 묶어 구별해줘야 한다는 점이다. 그렇지 않으면 에러가 발생한다.
앞에서 행과 열을 추출하는 방법에 대해 알아봤다.
그런데 데이터를 다루다보면, 특정 열의 특정 행 값만 추출해야 하는 경우가 있다.
이번에는 이를 복합 수행하는 방법에 대해 살펴볼 것이다.
예를 들어 키가 200 이상인 친구들에 대해, 해당 친구들의 이름과 키 정보를 알고싶다고 하자.
이런 경우에는 아래와 같이 코드를 구성하여 해당 정보를 추출할 수 있다.
# 1. 원하는 조건의 행을 먼저 추출
part_zoo_df = zoo_df[zoo_df['키(cm)']>=200]
# 2. 추출한 DataFrame에서 원하는 열을 추출
part_zoo_df[['이름', '키(cm)']]
코드를 구성하는데 있어서 주요 포인트를 코드의 주석으로 달아놨는데, 이를 다시 정리해보면 아래와 같다.
a. 원하는 조건의 행을 먼저 추출한다.
b. 추출한 DataFrame에서 원하는 열을 추출한다.
쉽게 말해서, 행과 열에 대한 각각의 작업을 차례로 수행하면 원하는 행과 열을 추출할 수 있다는 것을 알 수 있다.
앞에서 원하는 행과 열을 추출하는 방법에 대해 알아봤다.
그런데 이를 한 번에 수행해주는 메소드가 존재한다.
.loc[]가 바로 그것이다.
이번에는 이 .loc[]의 사용법에 대해 알아볼 것이다.
들어가기 전에 .loc[]를 사용하는 방법에 대해 다음과 같이 간단히 기억해두자.
※ .loc[행 조건, 열 조건]
일단 이렇게 알아두면 해당 메소드를 이용하기 편하다.
그럼 앞서 이용한 zoo_df를 이용하여 한 번 확인해보자.
zoo_df에서 4~8 까지의 인덱스를 만족하는 행을 추출하는 방법은 아래와 같다.
zoo_df.loc[4:8]
.loc[]를 이용한 추출과, 이용하지 않는 경우의 추출에는 아래와 같은 차이점이 존재한다.
- .loc[]를 사용하는 경우의 행 추출 : zoo_df.loc[시작 인덱스 : 끝 인덱스]
- .loc[]를 사용하지 않는 경우의 행 추출 : zoo_df[시작 인덱스 : 끝 인덱스 +1]
그리고 위의 인덱스를 살펴보면 4부터 8까지 여전히 유지하고 있는 것을 확인할 수 있는데, 해당 인덱스를 다시 0부터 시작하도록 아래와 같이 재설정 할 수도 있다.
zoo_df.loc[4:8].reset_index()
위의 결과를 보면 인덱스가 다시 0부터 시작하는 것을 확인할 수 있다.
참고로 이렇게 인덱스를 다시 정렬하는 방법은 앞에서 진행한 모든 추출에 대해서도 적용할 수 있다.
추가로 위의 인덱스 재정렬 과정을 거치니 기존의 인덱스를 표현해주는 index Column이 추가되었는데, 이는 .drop() 메소드를 이용하여 다음과 같이 삭제할 수도 있다.
zoo_df_a = zoo_df.loc[4:8].reset_index().drop(columns = ['index'], inplace = False)
zoo_df_a
그리고 위의 코드에서 inplace = False를 이용하였는데, inplace와 관련된 주의사항은 예전 글에서 한 번 소개한 바 있다.
다시 확인이 필요하다면 아래 링크 글의 중간쯤에 있는 ※주의※ 를 참조하도록 하자.
inplace 관련 링크 : https://kongalmengi.tistory.com/15
[Python](Pandas) Series와 DataFrame
먼저 Pandas 라이브러리를 이용하기 위해서는 다음과 같이 라이브러리를 불러와야 한다. import pandas as pd 그리고 라이브러리를 불러오는데 성공했으면, 다음과 같이 Pandas 라이브러리의 버전도 확
kongalmengi.tistory.com
.loc[]를 이용하여 특정 열(Column)을 추출할 수도 있다.
그런데 .loc[]를 이용하지 않는 경우와 비교하면 조금 다르다. 행추출에 대한 정보를 함께 담고 있어야 한다.
아래 코드를 통해 직접 확인해보자.
zoo_df.loc[:,['종류', '이름', '들이받은 수']]
일단 .loc[]에 대해 앞서 설명한 부분 중에서 다음을 다시 떠올려보자.
- .loc[행 조건, 열 조건]
그리고 다시 위의 코드를 살펴보자. 그럼 코드에서 행 조건과 열 조건을 다음과 같이 분류할 수 있다.
- 행 조건 : :
- 열 조건 : ['종류', '이름', '들이받은 수']
여기서 행 조건을 보면 그냥 콜론만 있는데, 이는 모든 행에 대해 추출하겠다는 의미이다.
열 조건은 말 그대로 '종류', '이름', '들이받은 수'에 해당하는 열을 추출하겠다는 의미이다.
그럼 이번에는 행 조건과 열 조건을 모두 이용하여 특정 행과 열을 추출해보자.
.loc[]에 행 조건과 열 조건을 설정해주면 가능한데, 다음과 같은 설정대로 데이터를 추출해보자.
- 행 조건 : 사육사를 들이받은 수가 10회 이상 & 축사 재공사가 필요한 친구
- 열 조건 : '종류', '이름', '밥 추가' 열 뽑기
위의 조건에 따라 코드를 만들면 아래와 같다.
zoo_df.loc[(zoo_df['들이받은 수'] >=10) & (zoo_df['비고'] == '재공사 요망'), ['종류', '이름', '밥 추가']]
위의 코드에서 행 조건에 &를 이용하였는데, 이를 통해 조건을 동시에 만족하는 행을 추출하였다.
그리고 열에 대한 조건은 Column명을 이용하여 해당 열을 추출하였다.
연습도 할 겸, 한 가지 더 해보자.
이번에는 '코끼리'와 '흰꼬리사슴'의 이름과 밥 추가 여부를 살펴볼 것이다.
그럼 다음과 같이 코드를 구성하면 된다.
zoo_df.loc[(zoo_df['종류'] == '코끼리') | (zoo_df['종류'] == '흰꼬리사슴'), ['종류', '이름', '밥 추가']]
이렇게 코끼리와 흰꼬리 사슴에 대한 이름과 밥 추가 여부에 대한 정보를 추출할 수 있다.
[Python](Pandas) .groupby() 메소드 (0) | 2024.02.22 |
---|---|
[Python](Pandas) 데이터 가공-3 : DataFrame의 결측치 처리 (0) | 2024.02.20 |
[Python](Pandas) 데이터 가공-1 : DataFrame에 새로운 Column 추가하기 (0) | 2024.02.18 |
[Python](Pandas) DataFrame 합치기(concat, join, merge) (0) | 2024.02.16 |
[Python](Pandas) DataFrame 관련 메소드-2 (0) | 2024.02.16 |