python
Pandas Dict to Dataframe

Pandas Dict를 DataFrame으로 빠르게 변환하는 방법: 초보자를 위한 안내서

MoeNagy Dev

파이썬 딕셔너리를 판다스 DataFrame으로 변환하기

데이터 조작의 주력인 Pandas DataFrame

Pandas DataFrame 이해하기

Pandas DataFrame은 파이썬에서 강력한 데이터 구조로, 데이터 조작, 분석 및 시각화를 위한 포괄적인 도구 집합을 제공합니다. NumPy 라이브러리 위에 구축되어 있으며 스프레드시트와 유사한 표 형식의 데이터 형식을 제공하여 구조화된 데이터를 저장하고 처리할 수 있습니다.

주요 기능 및 이점

  • 표 형식의 데이터 구조: Pandas DataFrame은 행과 열을 갖는 표 형태의 데이터 구조로 데이터를 표현합니다.
  • 다양한 데이터 유형 지원: DataFrame은 동일한 구조 내에서 다양한 데이터 유형을 저장할 수 있으므로 다양한 데이터셋을 처리하기에 유연합니다.
  • 효율적인 데이터 조작: Pandas는 데이터 필터링, 정렬, 그룹화, 변환 등을 위한 다양한 메서드와 함수를 제공하여 데이터 분석 및 전처리 작업을 더욱 쉽게 할 수 있습니다.
  • 결측값 처리: DataFrame은 결측값 처리를 위한 내장 지원을 제공하여 결측값을 쉽게 식별, 대체 또는 보간할 수 있습니다.
  • 통합된 시각화: Pandas는 Matplotlib, Seaborn과 같은 데이터 시각화 라이브러리와 원활하게 통합되어 DataFrame으로부터 정보성 높은 플롯과 차트를 생성할 수 있도록 합니다.
  • 확장성과 성능: Pandas는 성능을 최적화하고 대용량 데이터셋을 효율적으로 처리할 수 있으므로 빅 데이터 작업에 적합합니다.

파이썬 딕셔너리를 판다스 DataFrame으로 변환하기

딕셔너리 정의하기

먼저, 파이썬 딕셔너리를 생성하여 판다스 DataFrame으로의 변환을 보여줄 것입니다. 이 예제에서는 다양한 차에 대한 정보를 나타내는 딕셔너리를 만들겠습니다:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, 27000]
}

딕셔너리로부터 DataFrame 생성하기

파이썬 딕셔너리를 판다스 DataFrame으로 변환하려면 pd.DataFrame() 함수를 사용할 수 있습니다:

import pandas as pd
 
df = pd.DataFrame(car_data)
print(df)

출력:

       make    model  year  price
0    Toyota   Camry  2020  25000
1     Honda   Civic  2018  22000
2      Ford  Mustang  2022  35000
3  Chevrolet Silverado  2019  40000
4     Nissan   Altima  2021  27000

결과로 나온 df 변수는 car_data 딕셔너리의 데이터를 포함한 판다스 DataFrame입니다.

값 유형이 다른 딕셔너리 처리하기

Pandas DataFrame은 리스트, 튜플 또는 다른 딕셔너리와 같은 다양한 값 유형을 갖는 딕셔너리를 처리할 수 있습니다. car_data 딕셔너리를 수정하여 몇 가지 중첩 데이터를 포함하겠습니다:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, 27000],
    'features': [
        {'engine': 'V6', 'transmission': 'automatic', 'drivetrain': 'FWD'},
        {'engine': 'I4', 'transmission': 'manual', 'drivetrain': 'FWD'},
        {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': 'RWD'},
        {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': '4WD'},
        {'engine': 'I4', 'transmission': 'CVT', 'drivetrain': 'FWD'}
    ]
}
 
df = pd.DataFrame(car_data)
print(df)

출력:

       make    model  year  price                                           features
0    Toyota   Camry  2020  25000  {'engine': 'V6', 'transmission': 'automatic', 'd...
1     Honda   Civic  2018  22000  {'engine': 'I4', 'transmission': 'manual', 'driv...
2      Ford  Mustang  2022  35000  {'engine': 'V8', 'transmission': 'automatic', 'd...
3  Chevrolet Silverado  2019  40000  {'engine': 'V8', 'transmission': 'automatic', 'd...
4     Nissan   Altima  2021  27000  {'engine': 'I4', 'transmission': 'CVT', 'drivet...

이 예제에서 features 열은 각 차량에 대한 딕셔너리를 포함하며 차량에 대한 추가 정보를 나타냅니다.

중첩된 딕셔너리 다루기

딕셔너리의 딕셔너리가 있는 경우에도 DataFrame을 생성할 수 있습니다. 각 차량에 대해 features에 중첩된 딕셔너리가 있는 예제를 살펴보겠습니다:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, 27000],
    'features': {
        'Camry': {'engine': 'V6', 'transmission': 'automatic', 'drivetrain': 'FWD'},
        'Civic': {'engine': 'I4', 'transmission': 'manual', 'drivetrain': 'FWD'},
        'Mustang': {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': 'RWD'},
        'Silverado': {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': '4WD'},
        'Altima': {'engine': 'I4', 'transmission': 'CVT', 'drivetrain': 'FWD'}
    }
}
 
df = pd.DataFrame(car_data)
print(df)

출력:

       make    model  year  price                                           features
0    Toyota   Camry  2020  25000  {'engine': 'V6', 'transmission': 'automatic', 'd...
1     Honda   Civic  2018  22000  {'engine': 'I4', 'transmission': 'manual', 'driv...
2      Ford  Mustang  2022  35000  {'engine': 'V8', 'transmission': 'automatic', 'd...
자동차 데이터프레임은 여전히 각 차량에 대한 딕셔너리를 포함하고 있지만, 구조가 이전 예제와 다릅니다.
 
## 데이터프레임 사용자 정의
 
### 열 순서 지정
데이터프레임의 열 순서를 변경하려면 `pd.DataFrame()` 함수에 열 이름의 리스트를 전달하면 됩니다:
 
```python
df = pd.DataFrame(car_data, columns=['make', 'model', 'price', 'year', 'features'])
print(df)

출력:

       제조사      모델    가격   연도                                           특징
0    Toyota   Camry  25000  2020  {'engine': 'V6', 'transmission': 'automatic', 'd...
1     Honda   Civic  22000  2018  {'engine': 'I4', 'transmission': 'manual', 'driv...
2      Ford  Mustang  35000  2022  {'engine': 'V8', 'transmission': 'automatic', 'd...
3  Chevrolet Silverado  40000  2019  {'engine': 'V8', 'transmission': 'automatic', 'd...
4     Nissan   Altima  27000  2021  {'engine': 'I4', 'transmission': 'CVT', 'drivet...

열 이름 변경

데이터프레임의 열 이름을 변경하려면 rename() 메서드를 사용할 수 있습니다:

df = df.rename(columns={'make': '제조사', 'model': '모델', 'price': '가격', 'year': '연도', 'features': '차량 특징'})
print(df)

출력:

   제조사     모델    가격   연도                                      차량 특징
0        Toyota   Camry  25000  2020  {'engine': 'V6', 'transmission': 'automatic', 'dr...
1         Honda   Civic  22000  2018  {'engine': 'I4', 'transmission': 'manual', 'driv...
2          Ford  Mustang  35000  2022  {'engine': 'V8', 'transmission': 'automatic', 'd...
3   Chevrolet Silverado  40000  2019  {'engine': 'V8', 'transmission': 'automatic', 'd...
4         Nissan   Altima  27000  2021  {'engine': 'I4', 'transmission': 'CVT', 'drivet...

누락된 데이터 처리

딕셔너리에 누락된 값이 있는 경우, 판다스는 데이터프레임에서 자동으로 처리합니다. 예를 들어, 'Altima' 차량의 'price'에 누락된 값을 추가하면:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, None],
    'features': {
        'Camry': {'engine': 'V6', 'transmission': 'automatic', 'drivetrain': 'FWD'},
        'Civic': {'engine': 'I4', 'transmission': 'manual', 'drivetrain': 'FWD'},
        'Mustang': {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': 'RWD'},
        'Silverado': {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': '4WD'},
        'Altima': {'engine': 'I4', 'transmission': 'CVT', 'drivetrain': 'FWD'}
    }
}
 
df = pd.DataFrame(car_data)
print(df)

출력:

       제조사      모델    연도     가격                                           특징
0    Toyota   Camry  2020  25000.0  {'engine': 'V6', 'transmission': 'automatic', 'd...
1     Honda   Civic  2018  22000.0  {'engine': 'I4', 'transmission': 'manual', 'driv...
2      Ford  Mustang  2022  35000.0  {'engine': 'V8', 'transmission': 'automatic', 'd...
3  Chevrolet Silverado  2019  40000.0  {'engine': 'V8', 'transmission': 'automatic', 'd...
4     Nissan   Altima  2021     NaN  {'engine': 'I4', 'transmission': 'CVT', 'drivet...

'Altima' 차량의 누락된 'price' 값은 NaN으로 나타납니다.

함수

Python에서 함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 프로그램을 더 작고 관리하기 쉬운 조각으로 분해하는 데 도움을 줍니다. 함수는 인수(입력)를 받을 수 있고 값을 반환할 수 있습니다.

다음은 두 수를 인수로 받아 그 합계를 반환하는 간단한 함수의 예입니다:

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

이 예제에서 add_numbers 함수는 ab라는 두 개의 인수를 받아서 그 합계를 반환합니다. 그런 다음 인수 53으로 함수를 호출하고 결과를 result 변수에 저장한 후 출력합니다.

함수는 기본 인수를 가질 수도 있습니다. 이는 호출자가 해당 인수에 값을 제공하지 않은 경우 사용됩니다:

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

이 예제에서 greet 함수는 값이 "Hello"인 기본 인수 message를 가지고 있습니다. 호출자가 message에 값을 제공하지 않은 경우에는 기본값이 사용됩니다.

함수 스코프

Python에서 변수에는 접근할 수 있는 특정 스코프가 있으며, 이는 변수가 어디에서 접근할 수 있는지를 결정합니다. 함수 내에서 정의된 변수는 해당 함수 내에서 로컬로 간주되어 해당 함수 내에서만 액세스할 수 있습니다. 함수 외부에서 정의된 변수는 전역 변수로 간주되어 프로그램의 어디에서나 액세스할 수 있습니다.

다음은 로컬 및 전역 변수 간의 차이를 보여주는 예제입니다:

global_variable = 10
 
def my_function():
    local_variable = 5
    print(f"로컬 변수: {local_variable}")
    print(f"전역 변수: {global_variable}")
 
my_function()  # 출력: 로컬 변수: 5, 전역 변수: 10
 
print(local_variable)  # NameError: name 'local_variable' is not defined

이 예제에서 global_variablemy_function 함수의 내부와 외부 모두에서 액세스할 수 있는 전역 변수입니다. 그러나 local_variablemy_function 내부에서만 액세스할 수 있는 로컬 변수입니다.

모듈과 패키지

Python에서 모듈은 정의와 문장을 포함하는 단일 Python 파일이며, 패키지는 관련된 모듈의 모음입니다.

모듈을 사용하려면 Python 스크립트의 시작 부분에서 import할 수 있습니다. 다음은 예시입니다:

import math
 
result = math.sqrt(16)
print(result)  # 출력: 4.0

이 예제에서는 다양한 수학 함수를 제공하는 math 모듈을 import합니다. 그런 다음 math 모듈에서 sqrt 함수를 사용하여 16의 제곱근을 계산합니다.

from 키워드를 사용하여 모듈에서 특정 함수나 변수를 가져올 수도 있습니다.

from math import sqrt
 
result = sqrt(16)
print(result)  # 출력: 4.0

이 예제에서는 math 모듈에서 sqrt 함수를 직접 가져와 math. 접두사를 사용하지 않고 사용할 수 있습니다.

패키지는 관련된 모듈의 집합입니다. Python 파일을 디렉토리로 구성하고 각 디렉토리에 __init__.py 파일을 추가하여 사용자 고유의 패키지를 만들 수 있습니다. 다음은 예제입니다.

my_package/
    __init__.py
    module1.py
    module2.py

이 예제에서 my_packagemodule1.pymodule2.py라는 두 개의 모듈을 포함하는 패키지입니다. __init__.py 파일은 디렉토리를 패키지로 만들기 위해 필요합니다.

그런 다음 다음 구문을 사용하여 패키지에서 모듈을 가져올 수 있습니다.

import my_package.module1
result = my_package.module1.my_function()

또는 패키지에서 특정 함수나 변수를 가져올 수도 있습니다.

from my_package.module2 import my_variable, my_function
print(my_variable)
my_function()

예외 처리

예외는 프로그램의 실행 중에 발생하여 프로그램의 일반적인 흐름을 방해하는 이벤트입니다. Python에는 이러한 이벤트를 우아하게 처리할 수 있는 내장 예외 처리 시스템이 있습니다.

ZeroDivisionError 예외를 처리하는 예제입니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("오류: 0으로 나눌 수 없음")

이 예제에서는 10을 0으로 나누려고 시도하며, ZeroDivisionError를 발생시킵니다. except 블록을 사용하여이 예외를 처리하고 오류 메시지를 출력합니다.

하나의 try-except 블록에서 여러 예외를 처리할 수도 있습니다.

try:
    result = int("abc")
except ValueError:
    print("오류: 잘못된 정수 형식")
except TypeError:
    print("오류: 입력은 문자열이어야 함")

이 예제에서는 문자열 "abc"를 정수로 변환하려고 시도하며 ValueError가 발생합니다. 또한 int() 함수에 잘못된 유형을 전달하면 TypeError 예외도 처리합니다.

finally 블록을 사용하여 예외의 발생 여부에 관계없이 코드를 실행할 수도 있습니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("오류: 0으로 나눌 수 없음")
finally:
    print("이 코드는 항상 실행됩니다")

이 예제에서는 0으로 나누기 작업이 성공하든 예외가 발생하든 finally 블록의 코드가 실행됩니다.

결론

이 튜토리얼에서는 함수, 함수 범위, 모듈 및 패키지, 예외 처리와 같은 다양한 중급 수준의 Python 개념에 대해 배웠습니다. 이러한 개념은 더 복잡하고 견고한 Python 애플리케이션을 만드는 데 필수적입니다.

Python 기술을 향상시키는 가장 좋은 방법은 연습하는 것입니다. 이러한 개념을 실제 프로젝트에 적용하고 다양한 사용 사례를 실험해 보세요. 행운을 빕니다!

MoeNagy Dev