Pandas
- 파이썬에서 표(테이블) 형태의 데이터를 다루기 위한 라이브러리이다.
Pandas에서 가장 알아야 할 것은 Seriese, DataFrame이라는 자료구조이다. 1차원 데이터를 다루는 데 효과적인 Seriese와 2차원 데이터를 다루는 데 효과적인DataFrame을 활용하여 파이썬만으로는 할 수 없었던 데이터 정제, 데이터 가공, 데이터 요약 및
분석을 할 수 있다.
#지정한 문자열 인덱스로 데이터 접근
kakao2 = Series([92600,92400,92100,94300,92300],
index=['2016-02-19',
'2016-02-18',
'2016-02-17',
'2016-02-16',
'2016-02-15'])
print(kakao2['2016-02-19'])
시리즈를 생성할때 지정한 인덱스(2016-02-19)를 통해 데이터에 접근한다.
# 딕셔너리를 사용한 기본 DataFrame 생성
# 칼럼 선택을 통해 각 Series 객체에 접근
raw_data = {'col0': [1,2,3,4],
'col1': [10,20,30,40],
'col2': [100,200,300,400],}
# 칼럼 선택을 통해 각 Series 객체에 접근
data = DataFrame(raw_data)
data['col1']
print(data['col0'])
print(type(data['col0']))
key:string value : list(int)
인 딕셔너리 raw_data를 사용해서 data라는 DataFrame을 만든다.
key값이었던 문자열들이 칼럼이 되어 data['col1']처럼 칼럼 선택을 통해 각 Series 객체에 접근한다.
#인덱스 순서가 서로 다른 두 개의 Series 생성
mine = Series([10,20,30],index=['naver','sk','kt'])
friend = Series([10,30,20],index=['kt','naver','sk'])
merge = mine + friend
인덱스의 구성이 같은 두 시리즈를 더하면 각 인덱스에 해당하는 값끼리 더해진 시리즈가 된다.

#주가 데이터(OHLC) DataFrame 생성 (칼럼 순서 및 인덱스 지정)
#주가 데이터(OHLC) DataFrame 생성 (칼럼 순서 및 인덱스 지정)
daeshin = {'open': [11650,11100,11200,11100,11000],
'high': [12100,11800,11200,11100,11150],
'low': [11600,11500,10900,10950,10900],
'close': [11900,11600,11000,11100,11050]
}
대신증권의 시가, 고가, 저가, 종가 문자열을 키, 가격을 값으로 갖는 딕셔너리를 정의한다.
# columns로 칼럼 순서를 정렬하고,
# index로 날짜를 지정하여 생성
daeshin_day = DataFrame(daeshin,
columns=['open', 'low', 'high','close'])
# index로 날짜를 지정하여 생성
date = ['16.02.29', '16.02.26', '16.02.25',
'16.02.24', '16.02.23']
daeshin_day = DataFrame(daeshin,
columns=['open',
'high',
'low',
'close'],
index=date)
앞서 정의한 daeshin 딕셔너리와 다시 정의한 칼럼 순서, 리스트로 정의한 날짜 date를 인덱스로 만들어 DataFrame()에 전달해 데이터프레임을 만든다.
# 칼럼 선택 (종가 데이터 선택)
close = daeshin_day['close']
print(close)
데이터프레임 daeshin_day에서 'close' 칼럼의 정보를 날짜별로 모아놓은 close라는 시리즈를 만든다.

# 로우 선택
# (기존 ix 대신 loc 메서드를 사용하여 특정 날짜 행 선택)
print(daeshin_day.loc['16.02.24'])
close와 달리 인덱스를 사용해 해당 날짜의 시가, 고가, 저가, 종가를 출력한다.

# 방법 A : .loc[행, 열] 구조로 정확하게 짚기
print(daeshin_day.loc['16.02.24', 'close'])
데이터프레임 daeshin_day에서 '16.02.24' 행 'close'열을 출력한다.

# 방법 B: 이미 뽑아둔 close 시리즈에서 날짜로 조회하기
print(close['16.02.24'])
미리 정의한 close 시리즈에 인덱스를 넣어 출력한다.

#CSV 파일 불러오기
import pandas as pd
df = pd.read_csv('./data/csv/medical.csv')
pandas를 import 해주고 read_csv 함수를 호출 해 medical.csv 파일을 읽어와 데이터프레임으로 만든다.
(필요시 인코딩방식 명시)
# 데이터의 상위 , 하위 5개 행 확인
print(df.head())
print(df.tail())
데이터프레임의 상위 , 하위 5개 행을 출력한다.

#데이터의 기본 정보 (행/열 개수, 데이터 타입, 결측치 유무) 확인
# 기술 통계량(평균, 최댓값, 최솟값 등 ) 요약 확인
print(df.info())
print(df.describe())
데이터의 행/열 개수, 데이터 타입, 결측치 유무를 확일 할 수 있는 info() 함수, 기술 통계량(평균, 최댓값, 최솟값 등 ) 요약을 확인할 수 있는 describe() 함수이다. 추가로 각 컬럼별 결측치의 개수를 확인 할 수 있는 함수를 isnull().sum()이라고한다. 위 함수들은
데이터 정제 과정에서 꼭 필요한 함수들이다.
# 'Age' 컬럼이 60 이상인 데이터만 필터링
senior_patients = df[df['Age']>=60]
Age 컬럼의 열 데이터 중 60이상인데이터만 필터링 하여 senior_patients(dtype : Series)에 저장한다.
# 여러 조건 결합 (나이가 60세 이상이면서 'NO_SHOW'가 'Yes'인 환자)
no_show_seniors =df[(df['Age']>=60)&(df['No-show']=='Yes')]
논리연산자 &를 사용하여 Age가 60 이상, No-show가 Yes인 데이터만 필터링하여 no_show_seniors( dtype : Series )에
저장한다.
결측치 처리 방법
# 방법 A : 결측치가 포함된 행을 모두 삭제하기
df_cleaned =df.dropna()
# 방법 B : 결측치를 특정 값(예: 0 또는 평균값)으로 채우기
df_filled =df.fillna(0)
df['Age'] = df["Age"].fillna(df['Age'].mean())
### 4. 데이터 그룹화 및 집계 (groupby)####
# 'No-show'(노쇼 여부)별로 'Age'(나이)의 평균 계산하기
age_by_noshow = df.groupby('No-show')['Age'].mean()
age_by_noshow는 노쇼 여부별로 Age의 평균값을 데이터로 갖는 시리즈이다.
# 여러 컬럼을 기준으로 집계 (성별과 노쇼 여부별 환자 수 카운트)
grouped_count = df.groupby(['Gender', 'No-show']).size()
print(grouped_count.index)
grouped_count는 df에서 Gender, No-show의 종류 (여기서는 개수는 2*2) 별로 환자수를 센다.
# 'Age' 컬럼을 기준으로 내림차순 정렬 (나이가)
df_sorted = df.sort_values(by='Age', ascending =False)
df에서 Age칼럼의값을 기준으로 내림차순 정렬한다. ascending=True면 오름차순.
# 'No-show' 컬럼에 어떤 값이 각각 몇개씩 들어있는지 확인
print(df['No-show'].value_counts())
비율이나 빈도 파악에 유용하다.
#가장 첫 번째 행(0번행) 데이터 가져오기
first_row =df.iloc[0]
df의 0번 행을 저장한다.
# 처음 5개 행과 처음 3개 열 슬라이싱 하기
subset = df.iloc[0:5, 0:3]
0~4번째 행, 0~2번째 열 정보를 subset에 저장한다. (5행3열)
##### Pandas pivot_table 사용법 #####
index: 세로 행에 배치할 기준
columns: 가로 열에 배치할 기준
values: 표 안에 채워 넣을 데이터(계산 대상)
aggfunc: 데이터의 대상 함수
# 예시 1: 성별(Gender)과 노쇼 여부(No-show)에 따른 평균 나이 (Age)
# 세로(index): 성별(Gender)
# 가로(columns): 노쇼 여부 (No-show)
# 값(values): 나이 (Age)의 평균
pivot_age = df.pivot_table(index='Gender',
columns='No-show',
values='Age',
aggfunc='mean')
인덱스를 'Gender'의 종류 (M,F), 칼럼을 'No-show'의 종류 (Yes, No), 데이터는 Age의 평균을 갖는 데이터프레임을 만든다.

# 성별 및 노쇼 여부별 환자 수 카운트
# margins 인자 추가시 가로/세로 총합 추가
pivot_gender_no_show = df.pivot_table(index='Gender',
columns='No-show',
values='PatientId',
aggfunc='count',
margins=True)
Gender,Noshow 별 환자의 수를 구한다.

#Pandas에는 df.pivot()과 df.pivot_table()
df.pivot(): 데이터에 중복된 행이 없을 때
df.pivot_table(): 병원 데이터처럼 중복된 항목(같은 성별, 같은 노쇼 등)
이 많아서 그룹화 하고 요약 통계(평균, 합계 등)
데이터 분석에서는 90% 이상 pivot_table을 사용
### 두 개 이상의 데이터프레임 병합하기 (merge)
### 두 개 이상의 데이터프레임 병합하기 (merge)
# 예시 데이터프레임 1: 진료 기록
df_medical = pd.DataFrame({
'PatientId': [101, 102, 103],
'No-show':['No','Yes','No']
})
# 예시 데이터프레임 2: 환자 주소 정보
df_info = pd.DataFrame({
'PatientId' : [101,102,104],
'Neighborhood' : ['Jardim', 'Maria', 'Centro']
})
# PatientId를 기준으로 두 데이터 프레임 병합
df_merged = pd.merge(df_medical, df_info,
on='PatientId',
how='outer')
'''
1. how= 'inner' (기본값)
2. how='left'
3. how ='right'
4. how = 'outer'
'''
임의의 데이터프레임 df_medical(인덱스는 지정하지 않았으므로 기본인덱스0,1,2, 칼럼은 PatientId,No-show )과
df_info( 인덱스는 지정하지 않았으므로 기본인덱스0,1,2, 칼럼은 PatientId, Neighborhood)
두 데이터프레임이 공유하는 칼럼 PatientId를 활용하여 데이터프레임을 병합한다.
마지막인자 how에 따라 어떤 데이터프레임의 PatientId값을 기준으로 병합할지 결정된다.
inner 선택시 두 데이터프레임의 교집합인 PatientId를 기준으로 병합되므로 새로운 결측치가 발생하지 않고,
outer 선택시 두 데이터프레임의 합집합인 PatientId를 기준으로 병합되므로 새로운 결측치가 발생할 수 있다.
###날짜 데이터 형식 변환(to_datetime) ###
# 'AppointmentDay' 컬럼을 문자열에서 날짜 형식으로 변환
df['AppointmentDay'] = pd.to_datetime(df['AppointmentDay'])
df['ScheduledDay'] = pd.to_datetime(df['ScheduledDay'])
#2. 접수 후 예약일까지 며칠이나 걸렸는지 대기 기간 계산
df['Waiting_Days'] = (df['AppointmentDay'] - df['ScheduledDay']).dt.days
예약일과 진료예정일 데이터를 문자열에서 날짜 형식으로변환한 뒤, (진료예정일 - 예약일)로 접수 후 예약일까지 대기기간을 계산하여 칼럼으로 추가한다.
### Pandas 데이터 분석 ###
'''
1. 데이터 로드 및 확인: read_csv(), head(), info()
2. 데이터 정제: 결측치 처리(dropna(), fillna()), 날짜 변환(to_datetime())
3. 데이터 가공: 파생 변수 생성(apply()), 데이터 병합(merge())
4. 데이터 요약 및 분석: groupby(), pivot_table(), value_counts()
'''
'파이썬' 카테고리의 다른 글
| 0713 ML/DL (0) | 2026.07.13 |
|---|---|
| 0710 Numpy (0) | 2026.07.10 |
| 0709 파이썬 기초 문법 복습 (0) | 2026.07.09 |
| 0708 데이터 분석 및 시각화 (0) | 2026.07.09 |
| 0706 Class (0) | 2026.07.08 |