🐼 Pandas
1. pandas란?
- 데이터 조작, 분석, 전처리, 시각화 등을 편리하게 수행할 수 있도록 도와주는 파이썬 라이브러리
- pandas를 사용하면 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있음
- 또한 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 라이브러리
2. pandas 자료구조
(1) Series (1차원)
- 값과 인덱스로 구성이 되어있음
- 값은 numpy 배열. 인덱스는 지정하지 않으면 자동 부여되는 숫자.
- 인덱스가 정수일 필요는 없음.
import pandas as pd
# ex1) 인덱스 지정
s = pd.Series([90, 85, 70], index=["철수", "영희", "민수"])
print(s)
####### 결과 #######
# 철수 90
# 영희 85
# 민수 70
# dtype: int64
# ex2) 인덱스 지정 x
data = pd.Series([0.25, 0.5, 0.75, 1.0])
print(data)
####### 결과 #######
# 0 0.25
# 1 0.50
# 2 0.75
# 3 1.00
# dtype: float64
Series 접근 방법
방법 |
설명 |
예시 |
결과 |
s[0] |
위치 기반 접근 |
s[0] |
100 |
s["영어"] |
라벨(이름) 기반 접근 |
s["영어"] |
85 |
s.loc["수학"] |
명시적 라벨 접근 |
s.loc["수학"] |
90 |
s.iloc[2] |
명시적 위치 접근 |
s.iloc[2] |
90 |
(2) DataFrame (2차원, 행과 열)
- 엑셀 시트처럼 행과 열로 구성된 표
- Series가 여러 개 모인 형태
import pandas as pd
# ex1)
people = {
'california': 11,
'texas': 22,
'new york': 33,
'florida': 44
}
area = {
'california': 55,
'texas': 66,
'new york': 77,
'florida': 88
}
area_s = pd.Series(area)
population_s = pd.Series(population)
states = pd.DataFrame({'population': population, 'area': area})
print(states)
####### 결과 #######
# population area
# california 11 55
# texas 22 66
# new york 33 77
# florida 44 88
# ex2)
data = {
"이름": ["철수", "영희", "민수"],
"국어": [100, 80, 90],
"영어": [85, 90, 95]
}
df = pd.DataFrame(data)
print(df)
####### 결과 #######
# 이름 국어 영어
# 0 철수 100 85
# 1 영희 80 90
# 2 민수 90 95
DataFrame 접근 방법
📌 열(Column) 접근
방법 |
설명 |
예시 |
결과 |
df["이름"] |
특정 열 조회 |
df["이름"] |
Series 형태로 “철수”, “영희”, “민수” |
df.이름 |
속성처럼 열 접근 (단, 이름에 공백 없을 때만) |
df.이름 |
위와 같은 결과 |
df[["이름", "영어"]] |
여러 열 조회 |
df[["이름", "영어"]] |
DataFrame 반환 |
📌 행(Row) 접근
방법 |
설명 |
예시 |
결과 |
df.iloc[0] |
첫 번째 행 (0번 인덱스) |
df.iloc[0] |
철수의 전체 정보 (Series) |
df.loc[1] |
인덱스 1번 행 |
df.loc[1] |
영희의 정보 (Series) |
df.iloc[1:3] |
슬라이싱으로 여러 행 |
df.iloc[1:3] |
영희, 민수 (DataFrame) |
📌 행 + 열 동시에 접근
방법 |
설명 |
예시 |
df.loc[0, "영어"] |
0번 행의 영어 점수 |
85 |
df.iloc[2, 1] |
2번째 행, 1번째 열 → 국어 점수 |
90 |
df.loc[:, "국어"] |
모든 행의 국어 점수 |
Series 반환 |
(3) pandas 기본 정보 확인하기
항목 |
설명 |
함수 |
데이터 모양(크기) |
행, 열 |
df.shape |
컬럼 이름 |
열의 이름들 |
df.columns |
인덱스 |
행의 번호 또는 라벨 |
df.index |
데이터 타입 |
각 열이 숫자인지, 문자열인지 |
df.dtypes |
간략한 정보 |
메모리 사용량, null 등 |
df.info() |
통계 요약 |
평균, 표준편차, 최대값 등 |
df.describe() |
샘플 데이터 |
앞/뒤 몇 줄만 확인 |
df.head(n) # 상위 n행 , df.tail(n) # 하위 n행 |
3. 파일 다루기
(1) CSV 파일 다루기
df = pd.read_csv("datasets/employees.csv")
print("기본 CSV 읽기:")
print(df.head()) # 상위 5개 행 출력
# 특정 열만 불러오기 + 상위 10개 행만 읽기
df_limited = pd.read_csv("datasets/employees.csv", usecols=['이름', '연봉'], nrows=10)
print("\n선택한 컬럼과 10개 행만:")
print(df_limited)
# 저장: 기존 DataFrame을 CSV 파일로 저장
df.to_csv("datasets/employees_saved.csv", index=False, encoding='utf-8-sig')
# index = False 하면 index를 저장하지 않음
(2) Excel 파일 다루기
# Excel 파일 읽기
try:
df = pd.read_excel('datasets/employees.xlsx', sheet_name='직원정보')
print("\nExcel에서 읽은 데이터:")
print(df.head())
except ImportError:
print("❗ openpyxl 또는 xlrd 패키지가 설치되어 있어야 합니다.")
print("pip install openpyxl 로 설치하세요.")
# 새로운 컬럼 추가 (예: 연봉(만원))
df['연봉_만원'] = df['연봉'] // 10000
# 조건 컬럼 추가
df['고연봉자'] = df['연봉'] > 4000
# 수정된 DataFrame 출력
print("✍️ 수정된 DataFrame:")
print(df)
# 수정된 데이터를 새 Excel 파일로 저장
df.to_excel('datasets/employees_updated.xlsx', index=False, sheet_name='업데이트된 직원 정보')
여러 시트로 저장하기 (ExcelWriter)
with pd.ExcelWriter('datasets/employees_multi.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='직원정보')
df.describe().to_excel(writer, sheet_name='요약통계')
4. 데이터 조작
조작 |
예시 |
반환 타입 |
단일 컬럼 선택 |
df['컬럼명'] |
Series |
여러 컬럼 선택 |
df[['컬럼명1', '컬럼명2']] |
DataFrame |
조건 필터링 |
df[df['컬럼명'] >= 값] |
DataFrame |
컬럼 추가 |
df['컬럼명'] = ... |
DataFrame |
정렬 |
df.sort_values('컬럼명') |
DataFrame |
import pandas as pd
data = {
'제품명': ['무선 마우스', '게이밍 키보드', 'USB-C 허브', '웹캠', '모니터'],
'카테고리': ['주변기기', '주변기기', '액세서리', '주변기기', '디스플레이'],
'가격': [25000, 55000, 32000, 48000, 200000],
'재고수량': [150, 80, 200, 60, 30]
}
df = pd.DataFrame(data)
(1) 컬럼 선택과 추가
# 단일 컬럼 선택 (Series 반환)
product_names = df['제품명']
print("📋 제품명 목록:")
print(product_names)
print(f"타입: {type(product_names)}") # Series
# 여러 컬럼 선택 (DataFrame 반환)
subset = df[['제품명', '가격']]
print("\n💰 제품명과 가격:")
print(subset)
print(f"타입: {type(subset)}") # DataFrame
# 새 컬럼 추가: 가격이 5만원 이상인지 여부
df['프리미엄'] = df['가격'] >= 50000
print("\n🏷️ 프리미엄 여부 컬럼 추가:")
print(df)
(2) 조건 필터링
# 가격이 4만원 이상인 제품
expensive_products = df[df['가격'] >= 40000]
print("💸 가격 4만원 이상 제품:")
print(expensive_products)
# 재고가 100개 이상인 제품만 필터링
in_stock = df[df['재고수량'] >= 100]
print("\n📦 재고 100개 이상:")
print(in_stock)
# 특정 카테고리 필터링 (isin 사용)
peripherals = df[df['카테고리'].isin(['주변기기'])]
print("\n🖥️ 주변기기 카테고리 제품:")
print(peripherals)
(3) 정렬
# 가격 오름차순 정렬
sorted_by_price = df.sort_values('가격')
print("🔽 가격 낮은 순 정렬:")
print(sorted_by_price)
# 재고수량 기준 내림차순 정렬
sorted_by_stock = df.sort_values('재고수량', ascending=False)
print("\n🔼 재고 많은 순 정렬:")
print(sorted_by_stock)
# 복합 정렬: 카테고리별로 묶고 가격 높은 순으로
multi_sorted = df.sort_values(['카테고리', '가격'], ascending=[True, False])
print("\n🧾 카테고리별 가격 내림차순 정렬:")
print(multi_sorted)
python 카테고리 내 다른 글 보러가기
댓글 남기기