본 내용을 보기 전에 Python 사전 준비 및 Python 완전 기초를 먼저 이해하셔야 합니다.
본 포스팅은 pandas 공식 홈페이지를 기반으로 작성하였습니다.
앞선 포스팅에서 계속 사용했던 titanic 승객 데이터와 air quality 데이터를 계속 사용하겠습니다.
import pandas as pd
titanic = pd.read_csv("D:/python_exer/titanic.csv")
titanic.head()
air_quality = pd.read_csv("D:/python_exer/air_quality_long.csv", index_col = "date.utc", parse_dates = True)
air_quality.head()
1. 테이블 구조 변경 방법
1.1. 행 정렬
1.1.1. 승객의 나이에 따라 titanic 승객 데이터 정렬하기
titanic.sort_values(by = "Age").head()
1.1.2. 객실 등급과 연령에 따른 titanic 승객 데이터 내림차순 정렬
titanic.sort_values(by = ["Pclass", "Age"], ascending = False).head()
Series.sort_values()를 사용하면 테이블의 행이 정의된 열에 따라 정렬됩니다. 이 경우 인덱스는 행 순서를 따르게 됩니다.
1.2. 길고 넓은 (long wide) 테이블 형식 데이터 생성
실습을 위해 air_quality 데이터 세트의 부분 데이터 세트를 사용해 보겠습니다. 우리는 NO2 데이터에 초점을 맞추고 각 위치(즉, 각 그룹의 헤더)의 처음 두 측정값만 사용합니다. 생성된 부분 데이터 세트를 no2_subset이라고 합니다.
# no2 데이터 필터링
no2 = titanic [titanic ["parameter"] == "no2"]
# 각 위치별(그룹별)로 2개의 헤더만 사용
no2_subset = no2.sort_index().groupby("location").head(2)
no2_subset
no2_subset.pivot(columns = "location", values = "value")
pivot() 함수는 순수하게 데이터의 형태를 변경합니다. 각 인덱스/열 조합에 대해 단일 값이 필요합니다.
pandas는 기본적으로 여러 열의 플로팅을 지원하므로 길고 넓은 테이블 형식에서 와이드 테이블 형식으로 변환하면 다른 시계열을 동시에 플로팅 할 수 있습니다.
no2.head()
import matplotlib
no2.pivot(columns = "location", values = "value").plot()
인덱스 매개변수를 정의하지 않은 경우, 기존 인덱스(행 레이블)가 사용됩니다.
1.3. 피벗 테이블
1.3.1. 각 스테이션의 NO2 및 PM2.5에 대한 평균 농도 구하기
air_quality.pivot_table(
____index = "location",
____columns = "parameter",
____values = "value",
____aggfunc = "mean"
)
pivot()의 경우 데이터만 재배열됩니다. 여러 값을 집계해야 하는 경우(위의 예에서는 서로 다른 시간 단계에서 측정된 값) pivot_table()을 사용하여 이러한 값을 요약하는 방법에 대한 집계 함수(예: 평균)를 제공할 수 있습니다.
피벗 테이블은 스프레드시트 소프트웨어에서 잘 알려진 개념입니다. 각 변수에 대한 요약 열에 대해 별도로 관심이 있는 경우 margin 매개변수를 True로 설정합니다.
air_quality.pivot_table(
____index = "location",
____columns = "parameter",
____values = "value",
____aggfunc = "mean",
____margins = True
)
pivot_table()은 실제로 groupby()에 직접 연결됩니다. 아래처럼 실행하면 매개변수와 위치를 모두 그룹화하여 동일한 결과를 도출할 수 있습니다.
air_quality.groupby(["location","parameter"]).mean()
1.4. 넓고 긴 형식으로
이전 섹션에서 만든 와이드 형식 테이블에서 다시 시작하기 위해 아래를 실행합니다.
no2_pivoted = no2.pivot(columns="location", values="value").reset_index()
no2_pivoted.head()
1.4.1. 단일 열(긴 형식)에서 모든 대기질 NO2 측정값 수집하기
no_2 = no2_pivoted.melt(id_vars="date.utc")
no_2.head()
DataFrame에 대한 pandas.melt() 메서드는 데이터 테이블을 와이드 형식에서 긴 형식으로 변환합니다. 열 머리글은 새로 생성된 열의 변수 이름이 됩니다. 이러한 방법은 pandas.melt()를 적용하는 방법에 대한 짧은 버전입니다. 이 방법은 id_vars에 언급되지 않은 모든 열을 두 개의 열로 함께 녹입니다(melt). 열 머리글 이름이 있는 열과 값 자체가 있는 열입니다. 후자의 열은 기본적으로 이름값을 가져옵니다.
pandas.melt() 메서드는 더 자세히 정의할 수 있습니다.
no_2 = no2_pivoted.melt(
____________id_vars="date.utc",
____________value_vars=["BETR801", "FR04014", "London Westminster"],
____________value_name="NO_2",
____________var_name="id_location"
)
no_2.head()
결과는 동일하지만 더 자세히 정의됩니다.
- value_vars는 함께 녹을 열을 명시적으로 정의합니다.
- value_name은 기본 열 이름값 대신 값 열에 대한 이름을 제공합니다.
- var_name은 열 헤더 이름을 수집하는 열에 대한 사용자 정의 열 이름을 제공합니다. 그렇지 않으면 인덱스 이름이나 기본 변수를 사용합니다.
따라서 인수 value_name 및 var_name은 생성된 두열에 대한 사용자 정의 이름일 뿐입니다. 녹일 열은 id_vars 및 value_vars로 정의됩니다.
2. Remember !
- 하나 이상의 열을 기준으로 정렬하는 것은 sort_values에서 지원됩니다.
- pivot 함수는 순전히 데이터의 재구성이며, pivot_table은 집계를 지원합니다.
- pivot의 반대(긴 형식에서 넓은 형식으로)는 melt 함수입니다(넓은 형식에서 긴 형식으로).
'Python > Pandas' 카테고리의 다른 글
Pandas 시계열 데이터 다루기 (0) | 2021.08.20 |
---|---|
Pandas 활용 테이블 결합 방법 (0) | 2021.08.19 |
Pandas 활용 요약통계량 생성하기 (0) | 2021.08.17 |
Pandas 신규 Column 생성 (0) | 2021.08.16 |
Pandas에서 플롯 생성 방안 (0) | 2021.08.15 |
댓글