데이터 분석에 있어 필수적인 라이브러리 Pandas에 대해서 포스트한 적이 있습니다. 데이터 분석을 하다보면, 특히 많이 사용하는 함수가 DataFrame과 Series 이고, 이것은 데이터를 효율적으로 다루기 위한 핵심 입니다.
이번 글에서는 이들의 기본 사용법부터 다양한 데이터 변환 방법까지 알아보겠습니다.
1. DataFrame과 Series 생성하기
Pandas의 두 가지 주요 데이터 구조를 먼저 이해해봅시다:
- Series: 1차원 배열 구조로, 인덱스가 있는 데이터의 단일 열
- DataFrame: 2차원 테이블 구조로, 여러 Series가 모인 형태
Series 생성하기
Series는 리스트, 딕셔너리, 스칼라 값 등으로 생성할 수 있습니다.
import pandas as pd
# 리스트로 Series 생성
s1 = pd.Series([1, 3, 5, 7, 9])
# 인덱스 지정하여 Series 생성
s2 = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
# 딕셔너리로 Series 생성
s3 = pd.Series({'a': 1, 'b': 3, 'c': 5})
DataFrame 생성하기
DataFrame은 다양한 방식으로 생성할 수 있습니다.
# 딕셔너리로 DataFrame 생성
df1 = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수'],
'나이': [25, 28, 31],
'직업': ['개발자', '디자이너', '마케터']
})
# 리스트의 리스트로 DataFrame 생성
df2 = pd.DataFrame([
['김철수', 25, '개발자'],
['이영희', 28, '디자이너'],
['박민수', 31, '마케터']
], columns=['이름', '나이', '직업'])
# CSV 파일에서 DataFrame 생성
df3 = pd.read_csv('data.csv')
2. 인덱싱과 슬라이싱
데이터에 접근하는 다양한 방법을 알아봅시다.
Series 인덱싱
s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
# 인덱스 라벨로 접근
print(s['a']) # 10
# 정수 위치로 접근
print(s[0]) # 10
# 여러 요소 접근
print(s[['a', 'c', 'e']]) # a 10
# c 30
# e 50
DataFrame 인덱싱
df = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수'],
'나이': [25, 28, 31],
'직업': ['개발자', '디자이너', '마케터']
})
# 열 접근
print(df['이름'])
# 여러 열 접근
print(df[['이름', '직업']])
# loc - 라벨 기반 인덱싱
print(df.loc[0, '이름']) # 김철수
print(df.loc[0:1, ['이름', '나이']])
# iloc - 위치 기반 인덱싱
print(df.iloc[0, 0]) # 김철수
print(df.iloc[0:2, 0:2])
3. 데이터 필터링
조건을 사용하여 데이터를 필터링하는 방법입니다.
df = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수', '최지은', '정현우'],
'나이': [25, 28, 31, 22, 35],
'직업': ['개발자', '디자이너', '마케터', '학생', '개발자']
})
# 단일 조건 필터링
개발자_df = df[df['직업'] == '개발자']
# 복합 조건 필터링
조건_df = df[(df['나이'] > 25) & (df['직업'] == '개발자')]
# isin 사용
특정직업_df = df[df['직업'].isin(['개발자', '디자이너'])]
# 문자열 메소드 사용
이씨_df = df[df['이름'].str.startswith('이')]
4. 데이터 타입과 구조 변환
데이터 타입을 변환하고 구조를 조작하는 방법을 알아봅시다.
데이터 타입 변환
# astype을 사용한 타입 변환
df['나이'] = df['나이'].astype(float)
df['나이'] = df['나이'].astype(str)
# 여러 열 한번에 변환
df = df.astype({'나이': 'int64', '이름': 'string'})
# to_numeric 사용하기
df['수치'] = pd.to_numeric(df['수치'], errors='coerce') # 변환 불가능한 값은 NaN으로
결측치 처리
# 결측치 확인
print(df.isnull().sum())
# 결측치 채우기
df['나이'].fillna(df['나이'].mean(), inplace=True)
# 결측치가 있는 행 제거
df_cleaned = df.dropna()
데이터 구조 변환
# 행과 열 전치
df_transposed = df.T
# 피벗 테이블 생성
pivot_table = df.pivot_table(index='직업', values='나이', aggfunc='mean')
# 멜트(Melt) - 넓은 형식에서 긴 형식으로 변환
melted_df = pd.melt(df, id_vars=['이름'], value_vars=['나이', '수치'])
# 그룹화 및 집계
grouped = df.groupby('직업')['나이'].mean()
5. 유용한 DataFrame 메소드
자주 사용되는 유용한 메소드들을 알아봅시다.
# 기본 통계 정보
print(df.describe())
# 상위/하위 행 보기
print(df.head(3))
print(df.tail(2))
# 중복 제거
df_unique = df.drop_duplicates()
# 정렬
df_sorted = df.sort_values(by='나이', ascending=False)
# 열 이름 변경
df.rename(columns={'나이': 'age', '직업': 'job'}, inplace=True)
# 인덱스 재설정
df.reset_index(drop=True, inplace=True)
마무리
이번 글에서는 Pandas의 DataFrame과 Series의 기본 사용법과 데이터 타입 및 구조 변환 방법에 대해 정리해 보았습니다. 이러한 기본 기능들을 잘 활용하면 데이터 분석 작업을 훨씬 효율적으로 수행할 수 있습니다.
계속해서 pandas와 관련한 데이터 처리 기법이나, 분석 사례 등을 포스트하도록 하겠습니다.
답글 남기기