데이터 분석/데이터 시각화
pandas
fullfish
2025. 10. 24. 11:45
Pandas (Panel Data System) 는 데이터 분석과 전처리를
위한 필수 라이브러리
Series | 1차원 데이터(열 하나) | pd.Series([1,2,3])
DataFrame | 2차원 테이블형 데이터 | pd.DataFrame([[1,2],[3,4]])
index | 행 이름 | 0,1,2,… 또는 지정 가능
columns | 열 이름 | ['age','height']
values | 실제 데이터 (NumPy 배열) | df.values
데이터 입출력 및 생성
# 딕셔너리로 생성
df = pd.DataFrame({
'name': ['A', 'B', 'C'],
'age': [25, 30, 27],
'score': [90, 85, 88]
})
# 리스트로 생성
s = pd.Series([10, 20, 30], name='value')
# CSV 불러오기
df = pd.read_csv('data.csv')
# CSV 저장
df.to_csv('output.csv', index=False)
# Excel
df = pd.read_excel('data.xlsx')
# JSON
df = pd.read_json('data.json')
데이터 확인
df.head(3) # 상위 3행
df.tail(2) # 하위 2행
df.info() # 데이터 구조 요약
df.describe() # 기초 통계량
df.shape # (행, 열)
df.columns # 열 이름 목록
df.index # 인덱스 정보
인덱싱, 슬라이싱, 조건 필터링
df['age'] # 특정 열 선택 (Series)
df[['name','score']] # 여러 열 선택 (DataFrame)
df.iloc[0] # 0 행 (Series)
df.iloc[0, 1] # 1 행, 1 열
df.loc[0, 'age'] # label 기반 접근
df.loc[:, 'score'] # 모든 행의 score 열
df.loc[:3, 'age'] # 0,1,2,3 행
df[df['age'] > 26] # 조건에 맞는 행
df[(df['age'] > 25) & (df['score'] >= 90)]
df.query('age > 25 and score >= 90') # 쿼리문 방식
결측치 처리
df.isnull().sum() # 결측치(None, NaN) 개수 확인 .sum() 한번 더 붙이면 전체의 결측치
df.dropna() # 결측 행 제거
df.fillna(df['age'].mean()) # 모든 열의 결측치를 age의 평균값으로 채움
# age 열만 채우고 싶으면
df['age'].fillna(df['age'].mean())# 또는
df.fillna({'age': df['age'].mean()}, inplace=True) # inplace는 원본 변경
df['score'].fillna(0)
데이터 변환 및 정제
# 열 이름 변경
df.rename(columns={'age':'Age'}, inplace=True)
# 타입 변환
df['age'] = df['age'].astype(float)
# 문자열 처리
df['name'] = df['name'].str.upper()
# 중복행 제거
df.drop_duplicates(inplace=True)
# 특정 열의 중복행 제거
df.drop_duplicates(subset='pname', keep='last', inplace=True)
# pname에서 중복 행 마지막꺼만 남기고 삭제
정렬 및 그룹화, 열 / 행 추가 및 삭제
df = pd.DataFrame({
'name': ['a', 'b', 'a', 'c'],
'age': [20, 22, 21, 23],
'score': [90, 75, 85, 60]
})
# 1. 정렬
# 'score' 열을 기준으로 내림차순 정렬
df.sort_values(by='score', ascending=False)
# 결과:
# name age score
# 0 a 20 90
# 2 a 21 85
# 1 b 22 75
# 3 c 23 60
# 2. 그룹별 평균
# 이름(name)별 score 평균 계산
df.groupby('name')['score'].mean()
# 결과:
# name
# a 87.5
# b 75.0
# c 60.0
# Name: score, dtype: float64
# 3. 그룹별 여러 연산
# 이름별로 age 평균, score 최대값 구하기
df.groupby('name').agg({'age': 'mean', 'score': 'max'})
# 결과:
# age score
# name
# a 20.5 90
# b 22.0 75
# c 23.0 60
# 4. 조건으로 새 열 추가
# score가 80보다 큰 경우 True/False로 표시
df['passed'] = df['score'] > 80
# 결과:
# name age score passed
# 0 a 20 90 True
# 1 b 22 75 False
# 2 a 21 85 True
# 3 c 23 60 False
# 5. 열 삭제
# age 열 삭제 (inplace=True로 원본 수정)
df.drop('age', axis=1, inplace=True)
# 결과:
# name score passed
# 0 a 90 True
# 1 b 75 False
# 2 a 85 True
# 3 c 60 False
# 6. 행 삭제
# 인덱스 0번과 2번 행 삭제
df.drop([0, 2], axis=0)
# 결과:
# name score passed
# 1 b 75 False
# 3 c 60 False
통계 및 수학 연산, 카테고리 처리(인코딩)
import pandas as pd
# 예시 데이터
df = pd.DataFrame({
'name': ['a', 'b', 'c', 'd'],
'age': [20, 22, 24, 26],
'score': [85, 90, 78, 88],
'salary': [200, 250, 210, 270],
'dept': ['HR', 'Sales', 'Sales', 'HR'],
'gender': ['M', 'F', 'F', 'M']
})
# 1. 평균(mean)
# score 열의 평균값 계산
df['score'].mean()
# 결과: 85.75
# 2. 표준편차(std)
# score 열의 표준편차 계산
df['score'].std()
# 결과: 약 5.12
# 3. 상관계수(correlation)
# age와 salary 간 상관계수 행렬
df.loc[:, ["age", "salary"]].corr()
# 결과:
# age salary
# age 1.000 0.982
# salary 0.982 1.000
# (1에 가까울수록 강한 양의 상관관계)
# 4. 범주형 → 원-핫 인코딩(one-hot encoding)
# dept 열을 더미변수(0/1 컬럼)로 변환
pd.get_dummies(df['dept'])
# 결과:
# HR Sales
# 0 1 0
# 1 0 1
# 2 0 1
# 3 1 0
# 5. 범주형 → 수치형으로 직접 매핑(map)
# gender 열에서 M은 0, F는 1로 변환
df['gender'] = df['gender'].map({'M': 0, 'F': 1})
df['gender'].replace({'M': 0, 'F': 1}, inplace=True) # 두개 같음
# 결과:
# name age score salary dept gender
# 0 a 20 85 200 HR 0
# 1 b 22 90 250 Sales 1
# 2 c 24 78 210 Sales 1
# 3 d 26 88 270 HR 0