python
Pandas DataFrame 열 쉽게 바꾸기: 빠른 가이드

Pandas DataFrame 열 쉽게 바꾸기: 빠른 가이드

MoeNagy Dev

Pandas 열 이름 변경 기본 사항

Pandas DataFrame의 열 이름 이해하기

Pandas DataFrame은 스프레드시트와 유사한 형식으로 데이터를 탭으로 구성된 이차원 데이터 구조입니다. DataFrame의 각 열은 서로 다른 특성 또는 변수를 나타내며, 열 이름은 데이터를 식별하고 처리하는 데 중요합니다.

열 이름에 접근하고 수정하기

columns 속성을 사용하여 DataFrame의 열 이름에 접근할 수 있습니다. 이렇게 하면 열 이름이 포함된 pandas Index 객체가 반환됩니다.

import pandas as pd
 
# 샘플 DataFrame 생성
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
})
 
# 열 이름에 접근하기
print(df.columns)
# 출력: Index(['A', 'B', 'C'], dtype='object')

열 이름을 수정하려면 columns 속성에 새로운 이름의 리스트나 배열을 할당하면 됩니다.

# 열 이름 변경하기
df.columns = ['col1', 'col2', 'col3']
print(df.columns)
# 출력: Index(['col1', 'col2', 'col3'], dtype='object')

단일 열 이름 바꾸기

rename() 메서드 사용하기

Pandas의 rename() 메서드를 사용하면 DataFrame의 하나 이상의 열을 이름을 바꿀 수 있습니다. 단일 열의 이름을 바꾸려면 rename() 메서드에 현재 열 이름과 새로운 열 이름을 인수로 전달하면 됩니다.

# 단일 열 이름 바꾸기
df = df.rename(columns={'col1': 'new_col1'})
print(df.columns)
# 출력: Index(['new_col1', 'col2', 'col3'], dtype='object')

새로운 열 이름 지정하기

단일 열의 이름을 바꿀 때 문자열로 새로운 열 이름을 지정할 수 있습니다.

# 단일 열 이름 바꾸기
df = df.rename(columns={'col2': 'updated_col2'})
print(df.columns)
# 출력: Index(['new_col1', 'updated_col2', 'col3'], dtype='object')

DataFrame을 원본 데이터에 직접 업데이트하기

기본적으로 rename() 메서드는 업데이트된 열 이름을 포함하는 새로운 DataFrame을 반환합니다. 원본 DataFrame을 직접 수정하려면 inplace 매개변수를 True로 설정하면 됩니다.

# 단일 열을 원본 데이터에 직접 업데이트하기
df.rename(columns={'updated_col2': 'final_col2'}, inplace=True)
print(df.columns)
# 출력: Index(['new_col1', 'final_col2', 'col3'], dtype='object')

여러 열 이름 바꾸기

한 번에 여러 열 이름 바꾸기

rename() 메서드에 딕셔너리를 전달하여 여러 열을 동시에 바꿀 수 있습니다. 여기서 키는 현재 열 이름이고 값은 새로운 열 이름입니다.

# 여러 열 이름 변경하기
df = df.rename(columns={'new_col1': 'column_a', 'final_col2': 'column_b', 'col3': 'column_c'})
print(df.columns)
# 출력: Index(['column_a', 'column_b', 'column_c'], dtype='object')

이전 이름과 새 이름을 매핑하는 딕셔너리 사용하기

rename() 메서드에 전달된 딕셔너리는 이전 열 이름과 새로운 열 이름 사이의 매핑 역할을 합니다.

# 딕셔너리를 사용하여 여러 열 이름 바꾸기
rename_dict = {'column_a': 'feature_1', 'column_b': 'feature_2', 'column_c': 'feature_3'}
df = df.rename(columns=rename_dict)
print(df.columns)
# 출력: Index(['feature_1', 'feature_2', 'feature_3'], dtype='object')

딕셔너리를 사용한 rename() 메서드 적용하기

rename() 메서드를 체인으로 연결하여 열 이름을 한 줄의 코드에서 업데이트할 수 있습니다.

# 딕셔너리를 사용한 rename() 메서드 체인
df = df.rename(columns={'feature_1': 'var_a', 'feature_2': 'var_b', 'feature_3': 'var_c'})
print(df.columns)
# 출력: Index(['var_a', 'var_b', 'var_c'], dtype='object')

조건에 따라 열 이름 바꾸기

특정 기준에 따라 열 이름 바꾸기

열 이름의 특정 조건이나 패턴에 따라 열 이름을 바꾸고 싶은 경우에는 람다 함수나 정규 표현식을 사용할 수 있습니다.

람다 함수나 정규 표현식 사용하기

람다 함수를 사용하여 열 이름을 바꾸는 예제입니다.

# 람다 함수를 사용하여 열 이름 바꾸기
df = df.rename(columns=lambda x: 'new_' + x if x.startswith('var') else x)
print(df.columns)
# 출력: Index(['new_var_a', 'new_var_b', 'new_var_c'], dtype='object')

정규 표현식을 사용하여 더 복잡한 이름 변경 작업을 수행할 수도 있습니다.

import re
 
# 정규 표현식을 사용하여 열 이름 바꾸기
df = df.rename(columns=lambda x: re.sub(r'^var_', 'feature_', x))
print(df.columns)
# 출력: Index(['feature_a', 'feature_b', 'feature_c'], dtype='object')

조건부 이름 변경 적용하기

rename() 메서드는 columns 인수로 딕셔너리나 함수를 받을 수 있습니다. 이를 활용하여 특정 기준에 따라 조건부로 이름을 변경할 수 있습니다.

# 조건부로 열 이름 변경하기
df = df.rename(columns=lambda x: 'col_' + x.upper() if x.startswith('feature') else x)
print(df.columns)
# 출력: Index(['COL_A', 'COL_B', 'COL_C'], dtype='object')

이름 바꾸기 중 중복 처리하기

중복 열 이름 식별하기

열 이름을 바꾸기 전에 DataFrame에서 중복된 열 이름이 있는지 확인하는 것이 중요합니다. Pandas는 duplicated() 메서드를 제공하여 중복된 열 이름을 식별할 수 있습니다.

# 중복된 열 이름 확인하기
print(df.columns.duplicated())
# 출력: array([False, False, False])

열 이름 바꾸기 중 충돌 해결하기

중복된 열 이름이 있는 경우, 열 이름을 바꾸기 전에 충돌을 해결해야 합니다. 중복된 열 이름 뒤에 접미사를 추가함으로써 이를 해결할 수 있습니다.

# 중복된 열 이름 해결하기
df.columns = [f"{col}_{i}" if col in df.columns[df.columns.duplicated()] else col for i, col in enumerate(df.columns)]
print(df.columns)
# Output: Index(['COL_A', 'COL_B', 'COL_C_0'], dtype='object')

열 이름의 고유성 보장

중복되는 열 이름을 해결한 후, 새로운 이름이 고유한지 확인하면서 열 이름을 바꿀 수 있습니다.

# 열 이름 바꾸기와 고유성 보장하기
df = df.rename(columns={'COL_A': 'feature_a', 'COL_B': 'feature_b', 'COL_C_0': 'feature_c'})
print(df.columns)
# 결과: Index(['feature_a', 'feature_b', 'feature_c'], dtype='object')

MultiIndex를 사용하여 열 이름 바꾸기

계층적 열 구조 다루기

Pandas DataFrame은 MultiIndex라는 계층적 열 구조를 가질 수 있습니다. 이 경우, 열 이름을 바꿀 때 MultiIndex의 다른 레벨을 고려해야 합니다.

# MultiIndex를 가진 DataFrame 생성
df = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=pd.MultiIndex.from_tuples([('A', 'X'), ('A', 'Y'), ('B', 'Z')]))
print(df.columns)
# 결과: MultiIndex([('A', 'X'), ('A', 'Y'), ('B', 'Z')], )

MultiIndex의 각 레벨 이름 바꾸기

MultiIndex의 각 레벨 이름을 바꾸기 위해 rename() 메서드에 딕셔너리를 전달할 수 있습니다. 이때, 키는 레벨 이름이 되고 값은 새로운 이름이 됩니다.

# MultiIndex의 레벨 이름 바꾸기
df = df.rename(columns=str.lower, level=0)
df = df.rename(columns={'x': 'feature_x', 'y': 'feature_y', 'z': 'feature_z'}, level=1)
print(df.columns)
# 결과: MultiIndex([('a', 'feature_x'), ('a', 'feature_y'), ('b', 'feature_z')], )

MultiIndex DataFrame의 열 이름 업데이트하기

MultiIndex DataFrame을 다룰 때, rename() 메서드에 딕셔너리나 함수를 전달하여 열 이름을 업데이트할 수 있습니다.

# MultiIndex DataFrame의 열 이름 바꾸기
df = df.rename(columns={('a', 'feature_x'): ('alpha', 'feat_x'), ('a', 'feature_y'): ('alpha', 'feat_y'), ('b', 'feature_z'): ('beta', 'feat_z')})
print(df.columns)
# 결과: MultiIndex([('alpha', 'feat_x'), ('alpha', 'feat_y'), ('beta', 'feat_z')], )

열 이름 변경 자동화

여러 열 이름 변경하기 위해 루프 사용

열 이름의 목록에 루프를 사용하여 하나씩 열 이름을 변경할 수 있습니다.

# 루프를 사용하여 열 이름 변경하기
old_names = ['alpha', 'beta', 'gamma']
new_names = ['feature_a', 'feature_b', 'feature_c']
 
for old, new in zip(old_names, new_names):
    df = df.rename(columns={old: new})
 
print(df.columns)
# 결과: Index(['feature_a', 'feature_b', 'feature_c'], dtype='object')

함수를 적용하여 열 이름 변경하기

열 이름 변경을 처리하는 함수를 정의하고 DataFrame에 적용할 수 있습니다.

# 함수를 사용하여 열 이름 변경하기
def rename_columns(df, mapping):
    return df.rename(columns=mapping)
 
rename_map = {'feature_a': 'var_a', 'feature_b': 'var_b', 'feature_c': 'var_c'}
df = rename_columns(df, rename_map)
print(df.columns)
# 결과: Index(['var_a', 'var_b', 'var_c'], dtype='object')

동적으로 새로운 열 이름 생성하기

특정한 패턴이나 규칙에 따라서 새로운 열 이름을 생성하고 변경할 수 있습니다. 함수나 루프를 사용하여 새로운 열 이름을 생성한 후 변경을 적용합니다.

# 동적으로 새로운 열 이름 생성하기
new_names = [f'col_{i}' for i in range(1, len(df.columns) + 1)]
df = df.rename(columns=dict(zip(df.columns, new_names)))
print(df.columns)
# 결과: Index(['col_1', 'col_2', 'col_3'], dtype='object')

열 이름 바꾸기와 데이터 정리

가독성을 높이기 위해 열 이름 변경하기

열 이름을 변경하여 데이터의 가독성과 이해도를 높일 수 있습니다. 각 열의 내용을 명확히 전달하는 서술적이고 의미 있는 이름을 사용하세요.

# 가독성을 높이기 위해 열 이름 변경하기
df = df.rename(columns={'col_1': 'customer_id', 'col_2': 'order_date', 'col_3': 'total_amount'})
print(df.columns)
# 결과: Index(['customer_id', 'order_date', 'total_amount'], dtype='object')

일관성을 위해 열 이름 표준화하기

열 이름이 일관된 규칙에 따라 작성되도록 하세요. 예를 들어 소문자, 스네이크 케이스 또는 카멜케이스를 사용하는 등 일관된 표기법을 사용하는 것이 코드와 데이터를 관리하기 쉽습니다.

# 열 이름 표준화하기
df = df.rename(columns=lambda x: x.lower().replace(' ', '_'))
print(df.columns)
# 결과: Index(['customer_id', 'order_date', 'total_amount'], dtype='object')

함수

함수는 Python의 기본 요소입니다. 함수를 사용하면 일련의 명령을 캡슐화하고 코드 전체에서 재사용할 수 있습니다. 함수는 인자를 받아들이고 특정 작업을 수행한 다음, 값을 반환할 수 있습니다.

다음은 직사각형의 면적을 계산하는 간단한 함수의 예입니다.

def calculate_area(length, width):
    area = length * width
    return area
 
# 사용 예시
length = 5
width = 10
result = calculate_area(length, width)
print(f"직사각형의 면적은 {result} 제곱 단위입니다.")

결과:

직사각형의 면적은 50 제곱 단위입니다.

이 예제에서 calculate_area 함수는 lengthwidth라는 두 개의 인자를 받아들이고, 계산된 면적을 반환합니다. 그런 다음, 필요한 인자를 전달하여 함수를 호출하고, 결과를 result 변수에 저장합니다.

함수 매개변수

함수에는 다른 유형의 매개변수가 있을 수 있습니다:

  • 위치 인자(Positional Arguments): 함수를 호출할 때 올바른 순서로 제공해야 하는 기본 매개변수입니다.
  • 키워드 인자(Keyword Arguments): 함수를 호출할 때 매개변수 이름을 지정하여 코드를 더 가독성 있게 만들고 인자의 순서를 변경할 수 있습니다.
  • 기본 인자(Default Arguments): 인자가 제공되지 않을 경우에 사용되는 기본값이 정의된 매개변수입니다.
  • 가변 길이 인수: 이는 함수에 임의의 개수의 인수를 전달할 수 있게 해줍니다. 이러한 인수들은 튜플이나 리스트로 수집됩니다.

다양한 유형의 매개변수를 보여주는 예제입니다:

def greet(name, greeting="Hello", punctuation="!"):
    print(f"{greeting}, {name}{punctuation}")
 
# 위치 인수
greet("Alice")  # 출력: Hello, Alice!
greet("Bob", "Hi")  # 출력: Hi, Bob!
 
# 키워드 인수
greet(name="Charlie", greeting="Hola")  # 출력: Hola, Charlie!
greet(punctuation=".", name="David")  # 출력: Hello, David.
 
# 가변 길이 인수
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

스코프와 네임스페이스

파이썬에서 변수들은 접근할 수 있고 수정할 수 있는 위치를 결정하는 정의된 스코프(scope)를 갖습니다. 두 가지 주요한 스코프가 있습니다:

  1. 로컬 스코프: 함수나 블록(예: 루프나 if 문 등) 내에 정의된 변수들은 로컬 스코프를 갖고 해당 함수나 블록 내에서만 접근할 수 있습니다.
  2. 전역 스코프: 어떤 함수나 블록에 속하지 않은 변수들은 전역 스코프를 갖고 코드의 어디서든 접근할 수 있습니다.

global 키워드를 사용하여 함수 내에서 전역 변수에 접근하고 수정할 수 있습니다.

global_variable = 10
 
def modify_global():
    global global_variable
    global_variable += 5
    print(f"전역 변수 값: {global_variable}")
 
modify_global()  # 출력: 전역 변수 값: 15
print(global_variable)  # 출력: 15

재귀 함수

재귀 함수는 문제를 해결하기 위해 자기 자신을 호출하는 함수입니다. 이는 비슷한 작은 하위 문제로 분해할 수 있는 문제를 해결하는 데 유용합니다.

숫자의 팩토리얼을 계산하는 재귀 함수의 예제입니다:

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)
 
print(factorial(5))  # 출력: 120

이 예제에서 factorial 함수는 n 값을 더 작은 값으로 자기 자신을 호출합니다. n이 0이거나 1일 때 기저 사례(base case)에 도달하면 1을 반환합니다. 그 후, 함수는 현재 n 값과 재귀 호출의 결과를 곱합니다.

모듈과 패키지

파이썬의 모듈화 디자인을 사용하면 코드를 재사용 가능한 구성요소인 모듈로 구성할 수 있습니다. 모듈은 함수, 클래스, 그리고 변수들을 포함할 수 있으며, 다른 부분의 코드에서 가져와 사용할 수 있습니다.

간단한 모듈을 생성하고 가져오는 예제입니다:

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

이 예제에서 my_module.py라는 모듈을 생성하고, 그 안에 greet 함수를 포함시켰습니다. main.py 파일에서 my_module을 가져와 그 안의 greet 함수를 사용합니다.

패키지는 관련된 모듈을 계층적 구조로 구성하는 방법입니다. 관련 기능을 그룹화해 코드를 관리하고 배포하기 쉽게 만들 수 있습니다.

간단한 패키지를 생성하는 예제입니다:

my_package/
    __init__.py
    math/
        __init__.py
        arithmetic.py
        geometry.py

이 예제에서 my_package라는 패키지가 있고, 그 안에 math라는 하위 패키지가 있습니다. 패키지와 하위 패키지의 __init__.py 파일은 파이썬이 그들을 패키지로 인식할 수 있도록 합니다.

그 후 패키지 내 모듈들의 함수를 가져와 사용할 수 있습니다:

from my_package.math.arithmetic import add
from my_package.math.geometry import calculate_area
 
result = add(5, 10)
print(result)  # 출력: 15
 
area = calculate_area(5, 10)
print(area)  # 출력: 50

오류와 예외 처리

파이썬은 실행 중에 발생할 수 있는 오류를 우아하게 처리할 수 있는 내장 예외 처리 메커니즘을 갖고 있습니다. 이는 try-except 블록을 사용하여 수행됩니다.

ZeroDivisionError를 처리하는 방법에 대한 예제입니다:

def divide(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("오류: 0으로 나눌 수 없음")
        return None
 
print(divide(10, 2))  # 출력: 5.0
print(divide(10, 0))  # 출력: 오류: 0으로 나눌 수 없음

이 예제에서 divide 함수는 첫 번째 인자를 두 번째 인자로 나누려고 시도합니다. ZeroDivisionError가 발생하면 except 블록이 실행되고 메시지가 출력됩니다. 함수는 결과 대신 None을 반환합니다.

여러 예외를 잡고 다르게 처리할 수도 있습니다:

def process_input(value):
    try:
        number = int(value)
        result = 100 / number
        return result
    except ValueError:
        print("오류: 잘못된 입력입니다. 숫자를 입력하세요.")
        return None
    except ZeroDivisionError:
        print("오류: 0으로 나눌 수 없음")
        return None
 
print(process_input("10"))  # 출력: 10.0
print(process_input("hello"))  # 출력: 오류: 잘못된 입력입니다. 숫자를 입력하세요.
print(process_input("0"))  # 출력: 오류: 0으로 나눌 수 없음

이 예제에서 process_input 함수는 먼저 입력 값을 정수로 변환하려고 시도합니다. ValueError가 발생하면(예: 입력이 유효한 숫자가 아닌 경우) 함수는 오류를 처리하고 None을 반환합니다. ZeroDivisionError가 발생하면 함수는 그것도 처리하고 None을 반환합니다.

결론

이 파이썬 튜토리얼에서 우리는 함수, 스코프와 네임스페이스, 재귀 함수, 모듈과 패키지, 그리고 오류 처리와 같은 다양한 주제를 다뤘습니다. 이러한 개념들은 효과적이고 유지 관리 가능한 파이썬 코드를 작성하는 데 핵심적입니다. Remember, the best way to improve your Python skills is to practice, experiment, and continue learning. Explore the vast ecosystem of Python libraries and frameworks, and don't hesitate to seek out resources, tutorials, and communities that can help you expand your knowledge.

Happy coding!

MoeNagy Dev

기억하세요, 파이썬 기술을 향상시키는 가장 좋은 방법은 연습하고 실험하며 계속해서 배우는 것입니다. 파이썬 라이브러리와 프레임워크의 방대한 생태계를 탐색하고 지식을 확장할 수 있는 자원, 자습서, 커뮤니티를 찾는 데 주저하지 마세요.

즐거운 코딩이 되길 바랍니다!

MoeNagy Dev