본문 바로가기
Python/Pandas

Pandas 테이블 구조 변경 방법

by 찐남 2021. 8. 18.
본 내용을 보기 전에 Python 사전 준비 및 Python 완전 기초를 먼저 이해하셔야 합니다.
본 포스팅은 pandas 공식 홈페이지를 기반으로 작성하였습니다.

 

앞선 포스팅에서 계속 사용했던 titanic 승객 데이터와 air quality 데이터를 계속 사용하겠습니다.

 

titanic.csv
0.06MB

 

import pandas as pd
titanic = pd.read_csv("D:/python_exer/titanic.csv")
titanic.head()

 

 

air_quality_no2.csv
0.03MB

 

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

댓글