Created at : 2024-09-06 15:26
Auther: Soo.Y

3. 데이터 탐색과 조작

데이터를 탐색하고 조작하는 것은 데이터 분석 과정에서 가장 중요한 부분 중 하나입니다. 이 장에서는 Polars를 사용하여 데이터프레임을 효율적으로 탐색하고 조작하는 다양한 방법을 살펴보겠습니다.


3.1 데이터 미리보기

데이터프레임의 구조와 내용을 빠르게 확인하기 위해 Polars에서는 몇 가지 유용한 메서드를 제공합니다. 이 메서드들은 데이터를 처음 살펴보는 데 매우 유용합니다.

3.1.1 head()

head() 메서드는 데이터프레임의 상위 몇 개의 행을 반환합니다. 기본값은 5개지만, 원하는 수만큼 행을 출력하도록 설정할 수 있습니다.

import polars as pl
 
# 데이터프레임 생성
df = pl.DataFrame({
    "name": ["Alice", "Bob", "Charlie", "David", "Eve"],
    "age": [25, 30, 35, 40, 22],
    "city": ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"]
})
 
# 상위 3개의 행 출력
print(df.head(3))

3.1.2 tail()

tail() 메서드는 데이터프레임의 하위 몇 개의 행을 반환합니다. head()와 마찬가지로 기본값은 5개입니다.

# 하위 2개의 행 출력
print(df.tail(2))

3.1.3 shape()

shape() 메서드는 데이터프레임의 행(row)과 열(column)의 개수를 반환합니다.

# 데이터프레임의 크기 (행, 열)
print(df.shape)

이 메서드는 데이터프레임의 전체 크기를 빠르게 파악하는 데 유용합니다.

3.1.4 columns()

columns() 메서드는 데이터프레임의 열 이름을 리스트로 반환합니다.

# 데이터프레임의 열 이름 출력
print(df.columns)

3.2 데이터 선택하기

Polars에서는 데이터프레임에서 특정 열과 행을 선택할 수 있는 다양한 방법을 제공합니다.

3.2.1 열 선택하기

Polars에서 열을 선택하는 가장 기본적인 방법은 select() 메서드를 사용하는 것입니다. 특정 열 하나를 선택하거나, 여러 개의 열을 리스트로 선택할 수 있습니다.

# 하나의 열 선택
age_col = df.select("age")
print(age_col)
 
# 여러 개의 열 선택
subset = df.select(["name", "city"])
print(subset)

select()를 사용하여 원하는 열만 따로 추출할 수 있습니다.

3.2.2 조건부 선택 (filter())

Polars에서 조건에 따라 특정 행을 선택할 때는 filter() 메서드를 사용합니다. filter()는 조건식을 인자로 받아, 조건을 만족하는 행들만 반환합니다.

# 나이가 30 이상인 행 선택
filtered_df = df.filter(pl.col("age") >= 30)
print(filtered_df)

위 코드에서는 “age” 열의 값이 30 이상인 행만 필터링하여 반환합니다.

3.2.3 다중 조건 필터링

Polars에서는 여러 조건을 결합하여 데이터를 필터링할 수 있습니다. 이때는 논리 연산자 &(and) 또는 |(or)를 사용합니다.

# 나이가 30 이상이고, 도시에 'Los Angeles'가 아닌 사람들 선택
filtered_df = df.filter((pl.col("age") >= 30) & (pl.col("city") != "Los Angeles"))
print(filtered_df)

이 예제에서는 나이가 30 이상이면서 도시가 “Los Angeles”가 아닌 행을 필터링합니다.


3.3 기본 통계량 구하기

Polars는 데이터에 대한 기본적인 통계량을 빠르게 계산할 수 있는 여러 메서드를 제공합니다.

3.3.1 describe()

describe() 메서드는 데이터프레임의 각 열에 대한 기본 통계량(평균, 표준편차, 최소값, 최대값 등)을 출력합니다.

# 데이터프레임의 기본 통계량 출력
print(df.describe())

3.3.2 기본 통계 메서드

Polars에서는 개별적인 통계량을 계산하는 다양한 메서드를 제공합니다.

  • 합계: sum()
  • 평균: mean()
  • 중앙값: median()
  • 최소값: min()
  • 최대값: max()

예를 들어, 각 열에 대해 평균과 합계를 구하는 방법은 다음과 같습니다.

# 'age' 열의 평균값 구하기
age_mean = df.select(pl.col("age").mean())
print(age_mean)
 
# 'age' 열의 합계 구하기
age_sum = df.select(pl.col("age").sum())
print(age_sum)

3.4 데이터 변형

Polars에서는 데이터를 변형하는 다양한 방법을 제공합니다. 여기서는 열을 추가하거나 수정하고, 데이터를 결합하는 방법을 다룹니다.

3.4.1 열 추가하기 (with_columns())

새로운 열을 추가하려면 with_columns() 메서드를 사용합니다. 새로운 열을 계산하거나 기존 열을 이용해 파생 변수를 만들 수 있습니다.

# 'age' 열에 5를 더한 새로운 열 추가
df = df.with_columns((pl.col("age") + 5).alias("age_plus_5"))
print(df)

위 예제에서는 “age” 열의 값에 5를 더한 age_plus_5 열을 새롭게 추가합니다.

3.4.2 기존 열 수정하기

기존 열을 수정할 때도 with_columns()를 사용합니다. 기존 열의 값을 변경하거나 재계산할 수 있습니다.

# 'age' 열 값을 모두 10 증가시키기
df = df.with_columns((pl.col("age") + 10).alias("age"))
print(df)

3.4.3 결합 및 병합

Polars에서는 두 개 이상의 데이터프레임을 결합하거나 병합하는 다양한 방법을 제공합니다.

3.4.3.1 concat()

concat() 메서드는 여러 데이터프레임을 수직 또는 수평으로 결합할 때 사용합니다.

# 두 개의 데이터프레임 수직 결합 (vstack)
df1 = pl.DataFrame({"col1": [1, 2], "col2": [3, 4]})
df2 = pl.DataFrame({"col1": [5, 6], "col2": [7, 8]})
 
df_combined = pl.concat([df1, df2], how="vertical")
print(df_combined)

위 예제에서 두 데이터프레임을 수직으로 결합하였습니다. how="vertical" 대신 how="horizontal"을 사용하면 수평 결합도 가능합니다.

3.4.3.2 join()

join() 메서드는 두 데이터프레임을 특정 열을 기준으로 병합할 때 사용합니다. 이때 Pandas와 유사하게 inner join, left join 등을 수행할 수 있습니다.

df_left = pl.DataFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"]
})
 
df_right = pl.DataFrame({
    "id": [1, 2, 4],
    "age": [25, 30, 40]
})
 
# 'id' 열을 기준으로 inner join
df_joined = df_left.join(df_right, on="id", how="inner")
print(df_joined)

3.5 정리

이 장에서는 Polars에서 데이터를 탐색하고 조작하는 여러 방법을 살펴보았습니다.

  • 데이터 미리보기: head(), tail(), shape(), columns() 등의 메서드를 사용해 데이터프레임의 구조와 내용을 빠르게 확인할 수 있습니다.
  • 데이터 선택: 특정 열이나 행을 선택하거나 조건을 기반으로 필터링할 수 있습니다.
  • 기본 통계량 계산: describe(), mean(), sum() 등의 메서드를 통해 데이터를 요약할 수 있습니다.
  • 데이터 변형: 열을 추가하거나 수정하고, 데이터프레임을 결합하는 방법을 배웠습니다.

관련 문서

1. Polars 소개