Pandas 데이터 처리 종합 가이드
1. 데이터 선택과 필터링
1.1 기본 선택 방법
import pandas as pd
import numpy as np
df = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수', '최지은', '김철수'],
'나이': [25, 30, 35, 28, 25],
'직업': ['개발자', '디자이너', '개발자', '마케터', '개발자'],
'급여': [3500, 3200, 4000, 3300, 3500]
})
개발자_데이터 = df.loc[df['직업'] == '개발자']
첫_세_행 = df.iloc[0:3]
조건1 = (df['나이'] >= 30) & (df['급여'] >= 3500)
고임금_고연령 = df.loc[조건1]
1.2 고급 필터링 기법
특정_직업 = df[df['직업'].isin(['개발자', '디자이너'])]
이름_검색 = df[df['이름'].str.contains('김')]
복합_조건 = df.loc[
(df['나이'] > 25) &
(df['급여'] >= 3500) |
(df['직업'] == '개발자')
]
2. 데이터프레임 값 변경 및 생성
2.1 조건부 값 변경
df['급여_등급'] = np.where(df['급여'] >= 3500, '높음', '낮음')
df['나이_그룹'] = df['나이'].apply(lambda x: '청년' if x < 30 else '중년')
df.loc[df['급여'] >= 4000, '급여_보너스'] = '대상'
df.loc[df['급여'] < 4000, '급여_보너스'] = '비대상'
2.2 대량 값 변경
직업_매핑 = {'개발자': 'Developer', '디자이너': 'Designer', '마케터': 'Marketer'}
df['직업_영문'] = df['직업'].replace(직업_매핑)
df['직급'] = df['급여'].map(lambda x: '사원' if x < 3300 else '대리' if x < 3800 else '과장')
3. 중복 제거와 결측치 처리
3.1 중복 제거
df_unique = df.drop_duplicates()
df_job_unique = df.drop_duplicates(subset=['직업'])
df_multi_unique = df.drop_duplicates(subset=['이름', '나이'], keep='first')
3.2 결측치 처리
df_na = df.copy()
df_na.loc[2, '급여'] = np.nan
df_na.loc[4, '직업'] = np.nan
결측치_확인 = df_na.isnull().sum()
df_na['급여'] = df_na['급여'].fillna(df_na['급여'].mean())
df_na['직업'] = df_na['직업'].fillna('미정')
df_na.loc[df_na['직업'].isnull(), '직업_상태'] = '확인필요'
df_na.loc[df_na['직업'].notnull(), '직업_상태'] = '확인완료'
4. 데이터 유형과 고유값 분석
4.1 데이터 유형 처리
데이터_타입 = df.dtypes
숫자형_컬럼 = df.select_dtypes(include=['int64', 'float64'])
문자형_컬럼 = df.select_dtypes(include=['object'])
df['나이'] = df['나이'].astype('float64')
df['급여'] = df['급여'].astype('int32')
4.2 고유값 분석
고유값_개수 = df.nunique()
직업_고유값 = df['직업'].unique()
직업_빈도 = df['직업'].value_counts()
나이_빈도 = df['나이'].value_counts(normalize=True)
5. 실전 활용 예시
5.1 데이터 전처리 파이프라인
def 데이터_전처리(df):
df = df.drop_duplicates()
df['급여'] = df['급여'].fillna(df['급여'].mean())
df['직업'] = df['직업'].fillna('미정')
df['급여_등급'] = np.where(df['급여'] >= df['급여'].mean(), '상위', '하위')
df['나이'] = df['나이'].astype('int32')
return df
df_cleaned = 데이터_전처리(df)
5.2 고급 분석 예시
직업별통계 = df.groupby('직업').agg({
'급여': ['mean', 'min', 'max', 'count'],
'나이': 'mean'
}).round(2)
df['나이대'] = pd.cut(df['나이'], bins=[0, 25, 30, 35, 100], labels=['25세이하', '26-30세', '31-35세', '36세이상'])
나이대별직업_분포 = pd.crosstab(df['나이대'], df['직업'])
6. 문자열 처리와 고급 필터링
6.1 문자열 메서드 활용
df['description_lower'] = df['description'].str.lower()
df['description_length'] = df['description'].str.len()
df['first_word'] = df['description'].str.split().str[0]
df['description_clean'] = df['description'].str.strip()
df['description_modified'] = df['description'].str.replace('sauce', 'dressing')
6.2 실전 활용 예시
def 메뉴_분류(df):
조건_매핑 = {
'vegetarian': df['description'].str.contains('Vegetables|Salad', case=False),
'meat': df['description'].str.contains('Beef|Chicken|Pork', case=False),
'pasta': df['description'].str.contains('Pasta|Spaghetti', case=False),
'sauce_based': df['description'].str.contains('sauce', case=False)
}
for category, condition in 조건_매핑.items():
df[f'is_{category}'] = condition
return df
df_categorized = 메뉴_분류(df)
주요 팁과 주의사항
- loc와 iloc 사용:
loc는 라벨 기반 인덱싱, iloc는 위치 기반 인덱싱에 적합
- 체이닝 주의: 메모리 사용 효율성을 위해 체이닝을 최소화하며
inplace=True 사용
지양
- 데이터 타입 확인과 변환: 처리 속도 향상을 위해 불필요한 데이터 타입을 변경하는 것이 좋음.