python
Pandas 2.0 마스터하기: 초보자를 위한 포괄적인 가이드

Pandas 2.0 마스터하기: 초보자를 위한 포괄적인 가이드

MoeNagy Dev

새로운 DataFrame 소개: 성능과 기능이 향상된 버전

개선된 DataFrame 개요: 간소화된 데이터 조작

Pandas 2.0에서 DataFrame은 큰 변화를 겪으며 데이터 조작과 분석을 위한 다양한 새로운 기능과 개선을 제공합니다. 업데이트된 DataFrame은 더 직관적이고 효율적인 인터페이스를 제공하여 복잡한 데이터 구조에서 작업하기 쉽게 해줍니다.

주요한 개선 사항 중 하나는 DataFrame.vstack()DataFrame.hstack() 메서드의 도입입니다. 이 메서드를 사용하면 여러 개의 DataFrame을 수직 또는 수평으로 쌓을 수 있습니다. 이를 통해 여러 소스에서 데이터를 결합하는 프로세스가 단순화되며, 수동으로 연결 또는 병합 작업을 수행할 필요를 줄입니다.

import pandas as pd
 
# 샘플 DataFrame 생성
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'A': [4, 5, 6], 'B': [7, 8, 9]})
 
# DataFrame 수직으로 쌓기
stacked_df = pd.DataFrame.vstack([df1, df2])
print(stacked_df)

Output:

   A  B
0  1  4
1  2  5
2  3  6
0  4  7
1  5  8
2  6  9

효율적인 메모리 관리: 저장 공간 최적화와 오버헤드 감소

Pandas 2.0은 메모리 관리를 개선하고 DataFrame의 전체 풋프린트를 줄이기 위한 다양한 기능을 도입합니다. 그 중 하나는 DataFrame.astype() 메서드의 도입으로, 이제 자동 메모리 최적화를 지원합니다. 이는 Pandas가 각 열에 가장 적합한 데이터 유형을 지능적으로 결정하여 데이터 무결성을 저해하지 않으면서 메모리 사용량을 줄이는 것을 의미합니다.

# 큰 정수 값으로 DataFrame 생성
df = pd.DataFrame({'A': [1_000_000, 2_000_000, 3_000_000]})
 
# 메모리 사용량 자동 최적화
df = df.astype('int32')
print(df.memory_usage())

Output:

Int32    12
dtype: int64

위 예제에서 Pandas는 열을 int64에서 int32로 자동으로 변환하여 데이터 손실 없이 메모리 풋프린트를 반으로 줄입니다.

이질적 데이터 처리 개선: 다양한 데이터 유형의 원활한 통합

Pandas 2.0은 이질적 데이터 처리 기능을 개선하여 단일 DataFrame 내에서 다양한 데이터 유형을 원활하게 통합할 수 있게 합니다. 이는 숫자, 범주형 및 텍스트 정보가 혼합된 데이터셋을 다룰 때 특히 유용합니다.

# 다양한 데이터 유형의 DataFrame 생성
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['a', 'b', 'c'],
    'C': [True, False, True]
})
 
# 데이터 유형 확인
print(df.dtypes)

Output:

A     int64
B    object
C       bool
dtype: object

Pandas 2.0의 향상된 이질적 데이터 처리 기능을 통해 각 열에 가장 적합한 데이터 유형이 할당되어 복잡한 데이터셋을 다루기가 더 쉬워지며, 데이터 유형 변환 작업을 광범위하게 수행할 필요가 없어집니다.

새로운 인덱싱 기능 탐색

Multi-Index 소개: 계층적 데이터 구성

Pandas 2.0은 DataFrame 내에서 계층적 데이터 구조를 생성할 수 있는 Multi-Index 기능에 대한 큰 개선을 도입합니다. 이 강력한 기능을 통해 복잡한 데이터셋을 작업할 때 데이터를 조직화하고 액세스하는 데 효과적으로 사용할 수 있습니다.

# MultiIndex DataFrame 생성
tuples = [
    ('bar', 'one'), ('bar', 'two'),
    ('baz', 'one'), ('baz', 'two'),
    ('foo', 'one'), ('foo', 'two')
]
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6], 'B': [10, 20, 30, 40, 50, 60]}, index=index)
print(df)

Output:

                     A   B
first second              
bar    one           1  10
       two           2  20
baz    one           3  30
       two           4  40
foo    one           5  50
       two           6  60

Multi-Index를 사용하면 데이터를 계층적으로 다룰 수 있는 유연한 방법을 제공하므로, 계층의 여러 수준에서 데이터를 쉽게 액세스, 필터링 및 조작할 수 있습니다.

고급 인덱싱 기법: 복잡한 데이터 구조 습득

Pandas 2.0은 인덱싱 기능을 확장하여 복잡한 데이터 구조를 다루기 쉽게 해줍니다. 새로운 DataFrame.loc[]DataFrame.iloc[] 인덱서는 이제 여러 조건을 사용한 부울 인덱싱 및 고급 레이블 기반 슬라이싱과 같은 고급 작업을 지원합니다.

# 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
 
# 고급 부울 인덱싱
mask = (df['A'] > 2) & (df['B'] < 40)
filtered_df = df.loc[mask]
print(filtered_df)

Output:

   A   B
2  3  30

Pandas 2.0의 향상된 인덱싱 기능은 데이터 조작에 대해 더 유연성과 제어력을 제공하여 복잡한 데이터 구조를 더욱 효율적으로 다룰 수 있게 합니다.

효율적인 데이터 슬라이싱과 다이싱: 인덱싱의 능력 활용

Pandas 2.0은 데이터 슬라이싱과 다이싱에 대한 여러 개선 사항을 도입하여 DataFrame 내에서 특정 부분집합의 데이터를 추출하고 조작하기 쉽게 해줍니다. 새로운 DataFrame.loc[]DataFrame.iloc[] 인덱서는 이제 더 직관적이고 강력한 슬라이싱 작업을 지원합니다.

# 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]}, index=['a', 'b', 'c', 'd', 'e'])
 
# 레이블 기반 슬라이싱
print(df.loc['b':'d', 'A'])

Output:

b    2
c    3
d    4
Name: A, dtype: int64

Pandas 2.0의 향상된 인덱싱 기능은 데이터 조작에 대해 더 유연성과 제어력을 제공하여 복잡한 데이터 구조를 더욱 효율적으로 다룰 수 있게 합니다.

Data Wrangling in Pandas 2.0

데이터 정리 및 전처리: 데이터 준비를 간소화하기

Pandas 2.0은 데이터 정리 및 전처리에 대해 여러 개선 사항을 도입하여 데이터를 분석에 적합하게 준비하는 작업을 보다 쉽게 할 수 있게 되었습니다. 새로운 DataFrame.dropna() 메서드는 이제 누락된 데이터를 처리하는 더 많은 고급 옵션을 지원하며, 지정된 누락값의 임계값을 기준으로 행 또는 열을 삭제하는 기능을 제공합니다.

# 누락된 값을 포함하는 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, np.nan, 4, 5], 'B': [10, 20, 30, np.nan, 50]})
 
# 누락된 값을 포함하는 행 삭제
df_cleaned = df.dropna()
print(df_cleaned)

결과:

     A     B
0  1.0  10.0
1  2.0  20.0
2  4.0  50.0

또한, Pandas 2.0은 DataFrame.fillna()DataFrame.replace()와 같이 더 강력하고 유연한 데이터 처리 옵션을 제공하는 새로운 데이터 변환 함수를 도입했습니다.

누락된 데이터 처리: 개선된 보완 및 보간 방법

Pandas 2.0은 새로운 보완 및 보간 방법을 통해 누락된 데이터 처리를 개선했습니다. DataFrame.interpolate() 메서드는 이제 시계열 기반 보간을 포함한 더 넓은 범위의 보간 기법을 지원하여 복잡한 데이터셋에서 누락된 데이터를 처리하기 쉽게 해주었습니다.

# 누락된 값을 포함하는 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, np.nan, 4, 5], 'B': [10, 20, 30, np.nan, 50]}, index=pd.date_range('2022-01-01', periods=5, freq='D'))
 
# 시계열 기반 보간을 사용하여 누락된 값을 보완
df_interpolated = df.interpolate(method='time')
print(df_interpolated)

결과:

            A     B
2022-01-01  1.0  10.0
2022-01-02  2.0  20.0
2022-01-03  3.0  30.0
2022-01-04  4.0  40.0
2022-01-05  5.0  50.0

Pandas 2.0의 개선된 누락된 데이터 처리 기능은 불완전한 데이터셋으로 작업하는 데 더욱 효과적으로 데이터 준비 과정을 단순화합니다.

자동화된 데이터 변환: 벡터화된 연산 이용

Pandas 2.0은 벡터화된 연산의 사용을 향상시켜 복잡한 데이터 변환을 간결하고 효율적으로 수행할 수 있도록 했습니다. 새로운 DataFrame.apply() 메서드는 이제 고급 기능을 포함하여 사용자 지정 함수를 특정 축이나 개별 요소에 적용할 수 있습니다.

# 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': [10, 20, 30]})
 
# 각 요소에 대해 사용자 지정 함수 적용
df['C'] = df.apply(lambda x: x['A'] * x['B'], axis=1)
print(df)

결과:

   A   B   C
0  1  10  10
1  2  20  40
2  3  30  90

Pandas 2.0의 개선된 벡터화된 연산 기능을 이용하면 더욱 간결하고 효율적인 코드를 작성할 수 있으며, 개별 요소에 대한 데이터 변환을 위한 수작업을 줄일 수 있습니다.

데이터 분석 및 시각화

강력한 데이터 집계: 그룹화 및 피벗을 이용한 인사이트 발견

Pandas 2.0은 데이터 집계를 위한 여러 개선 사항을 도입하여 데이터에서 인사이트를 추출하기 쉽게 해주었습니다. 새로운 DataFrame.groupby()DataFrame.pivot_table() 메서드는 이제 다중 수준의 그룹화 및 누락된 값의 자동 처리와 같은 고급 옵션을 지원합니다.

# 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, 1, 2, 1, 2], 'B': [10, 20, 30, 40, 50, 60], 'C': [1, 1, 2, 2, 3, 3]})
 
# 다중 수준의 그룹화 및 집계
grouped = df.groupby(['A', 'C'])['B'].mean()
print(grouped)

결과:

A  C
1  1    20.0
   2    30.0
   3    50.0
2  1    20.0
   2    40.0
   3    60.0
Name: B, dtype: float64

Pandas 2.0의 개선된 데이터 집계 기능을 사용하면 데이터 내에서 인사이트와 패턴을 더욱 손쉽게 확인할 수 있으며, 더욱 정교한 데이터 분석이 가능합니다.

상호작용적 데이터 시각화: Pandas와 시각화 라이브러리의 통합

Pandas 2.0은 Matplotlib 및 Plotly와 같은 인기있는 데이터 시각화 라이브러리와의 통합을 간소화했습니다. 새로운 DataFrame.plot() 메서드는 이제 이러한 라이브러리와 더 원활하게 통합되어 Pandas DataFrame에서 직접 대화형 및 사용자 정의 가능한 시각화를 생성할 수 있습니다.

# 샘플 DataFrame 생성
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [10, 20, 30, 40, 50]})
 
# 대화형 선 그래프 생성
df.plot(x='A', y='B', kind='line')

Pandas 2.0의 개선된 데이터 시각화 기능을 사용하면 더욱 정보성이 있는 시각화를 생성할 수 있으며, 인사이트를 더 잘 파악하고 전달할 수 있습니다.

고급 통계 분석: Pandas를 활용한 예측 모델링

Pandas 2.0은 통계 및 머신러닝 라이브러리와의 통합을 강화하여 Pandas 워크플로 내에서 고급 데이터 분석 및 예측 모델링을 보다 쉽게 수행할 수 있도록 했습니다. 새로운 DataFrame.apply() 메서드는 이제 scikit-learn이나 statsmodels와 같은 외부 라이브러리를 활용할 수 있는 사용자 지정 함수의 적용을 지원합니다.

함수

함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 이를 통해 코드를 더 작고 관리하기 쉬운 단위로 나누어 작성할 수 있으므로 코드를 읽고 이해하고 유지보수하기가 쉬워집니다.

함수 정의

Python에서 함수를 정의하는 방법은 def 키워드를 사용하여 함수 이름, 괄호, 콜론으로 이루어진 함수 정의를 작성하는 것입니다. 함수 몸체는 들여쓰기되며, 함수가 호출될 때 실행될 코드가 포함됩니다.

def greet(name):
    print(f"안녕하세요, {name}님!")

이 예제에서 greet 함수는 하나의 매개변수 name을 사용하며, 주어진 이름을 사용하여 인사 메시지를 출력합니다.

함수 매개변수

함수는 하나 이상의 매개변수를 허용할 수 있습니다. 매개변수는 함수가 호출될 때 함수로 전달되는 변수들입니다. 매개변수는 함수 정의의 괄호 내에 정의됩니다.

def calculate_area(length, width):
    area = length * width
    print(f"사각형의 넓이는 {area} 제곱 단위입니다.")
```python
calculate_area(5, 10)  # 출력: 직사각형의 넓이는 50 square units입니다.
 

이 예제에서 "calculate_area" 함수는 "length"와 "width"라는 두 개의 매개변수를 받고 직사각형의 넓이를 계산합니다.

반환문

함수는 값을 반환할 수도 있으며, 이 값은 코드의 다른 부분에서 사용할 수 있습니다. 값을 반환하려면 "return" 키워드를 사용합니다.

def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 출력: 7

이 예제에서 "add_numbers" 함수는 "a"와 "b"라는 두 개의 매개변수를 받고 그들의 합을 반환합니다.

기본 인수

함수 매개변수에 기본값을 정의할 수도 있습니다. 이는 함수가 호출될 때 매개변수가 제공되지 않으면 사용되는 값입니다.

def greet(name, message="Hello"):
    print(f"{message}, {name}!")
 
greet("Alice")  # 출력: Hello, Alice!
greet("Bob", "Hi")  # 출력: Hi, Bob!

이 예제에서 "greet" 함수는 기본값이 "Hello"인 "message"라는 기본 인수를 갖고 있습니다. 함수가 호출될 때 "message" 인수가 제공되지 않으면 기본값이 사용됩니다.

가변 인수

가끔은 변수 개수의 매개변수를 받는 함수를 작성해야 할 수도 있습니다. 이를 위해 "*args" 구문을 사용할 수 있습니다.

def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total
 
print(sum_numbers(1, 2, 3))  # 출력: 6
print(sum_numbers(4, 5, 6, 7, 8))  # 출력: 30

이 예제에서 "sum_numbers" 함수는 임의 개수의 매개변수를 받을 수 있으며, 이들은 "args"라는 튜플에 모아집니다. 이 함수는 튜플에 포함된 모든 숫자를 합산하여 결과를 반환합니다.

람다 함수 (익명 함수)

파이썬은 익명 함수인 람다 함수도 지원합니다. 람다 함수는 이름 없이 정의되는 한 줄짜리 작은 함수입니다.

square = lambda x: x ** 2
print(square(5))  # 출력: 25
 
add_numbers = lambda a, b: a + b
print(add_numbers(3, 4))  # 출력: 7

이 예제에서 "square" 함수는 "x"라는 하나의 인수를 받아서 "x"의 제곱을 반환하는 람다 함수로 정의되어 있습니다. "add_numbers" 함수 역시 "a"와 "b"라는 두 개의 인수를 받아 그들의 합을 반환하는 람다 함수로 정의되어 있습니다.

모듈과 패키지

파이썬에서는 모듈과 패키지를 사용하여 코드를 구성하고 재사용할 수 있습니다.

모듈

모듈은 파이썬 정의와 문장이 포함된 파일입니다. 모듈을 사용하면 코드를 논리적으로 구성하여 보다 쉽게 유지 관리하고 공유할 수 있습니다.

# my_module.py
def greet(name):
    print(f"Hello, {name}!")
 
# main.py
import my_module
my_module.greet("Alice")  # 출력: Hello, Alice!

이 예제에서 "greet" 함수는 "my_module.py" 파일에 정의되어 있으며, 이 함수는 "main.py" 파일에서 가져와 사용됩니다.

패키지

패키지는 모듈을 계층적인 디렉토리 구조로 구성하는 방법입니다. 이를 통해 더 크고 복잡한 애플리케이션을 생성할 수 있습니다.

my_package/
    __init__.py
    math_utils.py
    string_utils.py

이 예제에서 "my_package"는 "math_utils.py"와 "string_utils.py"라는 두 개의 모듈을 포함하는 패키지입니다. "init.py" 파일은 파이썬에게 해당 디렉토리가 패키지임을 알리는 특수한 파일입니다.

# main.py
from my_package import math_utils, string_utils
 
result = math_utils.add(2, 3)
print(result)  # 출력: 5
 
reversed_string = string_utils.reverse_string("hello")
print(reversed_string)  # 출력: "olleh"

이 예제에서 "math_utils"와 "string_utils" 모듈이 "my_package" 패키지에서 가져와 "main.py" 파일에서 사용됩니다.

파일 입출력

파이썬은 파일에서 읽기와 쓰기를 위한 기본 함수를 제공합니다.

파일 읽기

파일의 내용을 읽으려면 "open()" 함수를 사용하여 파일을 열고 "read()" 메소드를 사용하여 내용을 읽을 수 있습니다.

with open("example.txt", "r") as file:
    content = file.read()
    print(content)

이 예제에서 "open()" 함수는 "example.txt" 파일을 읽기 모드("r")로 열고 "read()" 메소드는 파일의 전체 내용을 읽습니다.

파일 쓰기

파일에 쓰기 위해서는 "open()" 함수를 사용하여 파일을 쓰기 모드("w")로 열고 "write()" 메소드를 사용하여 데이터를 파일에 씁니다.

with open("output.txt", "w") as file:
    file.write("This is some text to be written to the file.")

이 예제에서 "open()" 함수는 "output.txt" 파일을 쓰기 모드로 열고 "write()" 메소드를 사용하여 문자열을 파일에 씁니다.

파일 모드

"open()" 함수는 파일을 열 때 사용할 모드를 지정하는 두 번째 인수를 사용합니다. 일반적인 파일 모드는 다음과 같습니다:

  • "r": 읽기 모드 (기본값)
  • "w": 쓰기 모드 (기존 파일을 덮어씀)
  • "a": 추가 모드 (파일 끝에 추가)
  • "r+": 읽기 및 쓰기 모드
  • "b": 이진 모드 (텍스트가 아닌 파일에 대해 사용)

파일 예외 처리

파일 관련 예외, 예를 들어 파일이 존재하지 않거나 액세스 권한이 없는 경우 등,을 처리하는 것이 중요합니다. 예외를 처리하기 위해 "try-except" 블록을 사용하여 이러한 예외를 잡아 처리할 수 있습니다.

try:
    with open("non_existent_file.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("파일이 존재하지 않습니다.")

이 예제에서 "non_existent_file.txt" 파일이 존재하지 않으면 "FileNotFoundError" 예외가 잡히고 적절한 메시지가 출력됩니다.

결론

이 튜토리얼에서는 함수, 모듈, 패키지, 파일 입출력 등 다양한 파이썬 개념에 대해 알아보았습니다. 이러한 기능은 보다 복잡하고 구조화된 파이썬 프로그램을 작성하는 데 필수적입니다. 이러한 개념을 이해하고 적용함으로써 더 견고하고 유지 관리 가능한 코드를 작성할 수 있습니다.

---
korean
---

# 기본 마크다운 파일

이 마크다운 파일은 한국어로 작성되었습니다. 여기에는 일반적인 마크다운 문법과 컨텐츠를 포함하고 있습니다. 마크다운은 텍스트 기반의 문서 작성 방식으로, 간단하고 읽기 쉽게 작성할 수 있습니다.

## 볼드, 이탤릭, 링크, 이미지

**볼드**나 *이탤릭* 같은 텍스트 스타일을 적용할 수 있고, [링크](https://www.example.com)를 추가할 수 있습니다. 또한 이미지를 삽입할 수도 있습니다.

![이미지](https://path/to/image.png)

## 리스트와 헤더

마크다운에서는 순서가 있는 리스트와 순서가 없는 리스트를 만들 수 있습니다.

순서가 있는 리스트:

1. 첫 번째 아이템
2. 두 번째 아이템
3. 세 번째 아이템

순서가 없는 리스트:

- 아이템 1
- 아이템 2
- 아이템 3

또한 헤더를 사용하여 문서의 구조를 나타낼 수 있습니다.

## 코드블록

코드블록을 사용하면 여러 줄의 코드를 포맷팅할 수 있습니다.

```python
def hello_world():
    print("Hello, World!")

hello_world()

인용문

인용문을 사용하여 다른 사람의 발언이나 인용구를 표시할 수 있습니다.

"우리는 우리가 말한 그대로 되기를 이미 택했다." - 알베르 카뮈

테이블

테이블을 사용하여 데이터를 정렬하고 표시할 수 있습니다.

이름나이
Alice21
Bob25
Claire32

수평선

수평선을 사용하여 섹션을 분리할 수 있습니다.


마침말

이 상위 수준 마크다운 문서에서는 마크다운의 기본 요소와 구문을 살펴보았습니다. 이 외에도 더 많은 마크다운 요소가 있으며, 필요에 따라 사용할 수 있습니다. 마크다운의 모든 가능성을 발견하고 실험하는 것이 중요합니다.