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