데이터 분석 • 챕터 2 / 4
Pandas는 데이터 분석을 위한 파이썬 핵심 라이브러리 입니다.
| 비교 | NumPy | Pandas |
|---|---|---|
| 주요 용도 | 수치 연산 | 데이터 처리/분석 |
| 데이터 형태 | 배열, 행렬 | 테이블 형태 |
| 강점 | 고속 연산 | 데이터 조작, 병합 |
Pandas의 강점
테이블 형태의 정형 데이터 처리에 특화되어 있으며, 데이터 합산, 병합, 필터링 등의 작업을 쉽게 수행할 수 있습니다.
Pandas는 Series(1차원) 와 DataFrame(2차원) 구조를 제공합니다.
import pandas as pd
# Series (1차원)
s = pd.Series([1, 2, 3, 4])
# DataFrame (2차원)
df = pd.DataFrame({
'이름': ['홍창기', '황성빈', '김도영'],
'지역': ['서울', '부산', '광주'],
'방문일': ['2024-06-01', '2024-06-02', '2024-06-03'],
'예약코드': ['A123', 'B456', 'C789']
})| 이름 | 지역 | 방문일 | 예약코드 |
|---|---|---|---|
| 홍창기 | 서울 | 2024-06-01 | A123 |
| 황성빈 | 부산 | 2024-06-02 | B456 |
| 김도영 | 광주 | 2024-06-03 | C789 |
# 크기 확인 (행, 열)
print(df.shape) # (3, 4)
# 컬럼 이름 확인
print(df.columns) # Index(['이름', '지역', '방문일', '예약코드'], dtype='object')
# 데이터 구조 요약
df.info()
# 기본 통계 분석
df.describe()| 속성/메서드 | 설명 |
|---|---|
df.shape | 데이터프레임 크기 (행, 열) |
df.columns | 컬럼 이름 목록 |
df.info() | 데이터 구조 요약 |
df.describe() | 기본 통계 분석 |
# CSV 파일 로드
df = pd.read_csv('data.csv')
# JSON 파일 로드
df = pd.read_json('data.json')
# Excel 파일 로드
df = pd.read_excel('data.xlsx')# CSV로 저장
df.to_csv('output.csv', index=False)
# JSON으로 저장
df.to_json('output.json', orient='records')# 처음 5개 행
df.head()
# 마지막 5개 행
df.tail()
# 처음 10개 행
df.head(10)# 단일 조건
df[df['age'] >= 20]
# 복합 조건 (AND)
df[(df['age'] >= 20) & (df['gender'] == 'male')]
# 복합 조건 (OR)
df[(df['age'] >= 20) | (df['gender'] == 'male')]| 연산자 | 설명 | 예시 |
|---|---|---|
& | AND 조건 | (조건1) & (조건2) |
| | OR 조건 | (조건1) | (조건2) |
~ | NOT 조건 | ~(조건) |
주의사항
조건식에서 각 조건은 반드시 괄호로 감싸야 합니다. df[df['age'] >= 20 & df['gender'] == 'male']처럼 괄호 없이 사용하면 오류가 발생합니다.
# lambda 함수로 파생 변수 생성
df['level'] = df['age'].apply(lambda x: '성인' if x >= 20 else '미성년')
# 문자열 포함 여부 확인
df['has_python'] = df['skills'].str.contains("Python")
# 수치 계산
df['total'] = df['price'] * df['quantity']# 사용자 정의 함수 적용
def categorize_age(age):
if age < 20:
return '미성년'
elif age < 60:
return '성인'
else:
return '시니어'
df['age_group'] = df['age'].apply(categorize_age)# 부서별 평균 급여
df.groupby('department')['salary'].mean()
# 여러 컬럼으로 그룹화
df.groupby(['department', 'gender'])['salary'].mean()# 여러 통계를 한 번에 계산
df.groupby('department')['salary'].agg(['mean', 'sum', 'count'])# 텍스트 길이
df['text_len'] = df['text'].str.len()
# 단어 수
df['word_count'] = df['text'].str.split().str.len()# 문자열을 날짜로 변환
df['date'] = pd.to_datetime(df['date_str'])
# 날짜 속성 추출
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['hour'] = df['date'].dt.hour# 기본 병합 (inner join)
merged = df1.merge(df2, on='user')
# left join
merged = df1.merge(df2, on='user', how='left')
# 다른 컬럼명으로 병합
merged = df1.merge(df2, left_on='user_id', right_on='id')| how | 설명 |
|---|---|
inner | 양쪽 모두 존재하는 키만 (기본값) |
left | 왼쪽 기준, 오른쪽 없으면 NaN |
right | 오른쪽 기준 |
outer | 양쪽 모든 키 포함 |
# 부서별 평균 나이
pivot = df.pivot_table(
values='age',
index='department',
aggfunc='mean'
)
# 부서별, 성별 평균 급여
pivot = df.pivot_table(
values='salary',
index='department',
columns='gender',
aggfunc='mean'
)import pandas as pd
# 데이터 생성
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'department': ['Sales', 'IT', 'Sales', 'IT'],
'age': [25, 30, 35, 28],
'salary': [50000, 60000, 55000, 65000]
})
# 1. 기본 정보 확인
print(f"데이터 크기: {df.shape}")
print(df.info())
# 2. 조건 필터링 (30세 이상)
filtered = df[df['age'] >= 30]
print(f"\n30세 이상:\n{filtered}")
# 3. 그룹별 통계
dept_stats = df.groupby('department').agg({
'salary': ['mean', 'sum'],
'age': 'mean'
})
print(f"\n부서별 통계:\n{dept_stats}")
# 4. 파생 변수 생성
df['age_group'] = df['age'].apply(
lambda x: '청년' if x < 30 else '중년'
)
print(f"\n파생 변수 추가:\n{df}")| 개념 | 핵심 내용 |
|---|---|
| Pandas | 데이터 분석 핵심 라이브러리, 테이블 데이터 특화 |
| 데이터 구조 | Series(1차원), DataFrame(2차원) |
| 파일 I/O | read_csv, read_json, to_csv, to_json |
| 필터링 | 조건식 기반, &(AND), |(OR) |
| 그룹 연산 | groupby, agg |
| 병합 | merge (SQL JOIN과 유사) |
| 피벗 | pivot_table (데이터 요약) |