ID Name Age
0 1 Alice 25
1 2 Bob 30
2 3 Charlie 35
4. CSV 파일을 DataFrame으로 변환
df = pd.read_csv('data.csv') # CSV 파일 불러오기print(df.head()) # 상위 5개 행 출력
기본 데이터 탐색 및 인덱싱
1. 기본 정보 조회
data = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['Seoul', 'Busan', 'Incheon']}df = pd.DataFrame(data)print(df.info()) # 데이터프레임 정보 출력print(df.describe()) # 기본 통계 요약 정보print(df.shape) # 데이터프레임 크기 확인 (행, 열)print(df.columns) # 컬럼명 출력
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 3 non-null object
1 Age 3 non-null int64
2 City 3 non-null object
dtypes: int64(1), object(2)
memory usage: 200.0+ bytes
None
Age
count 3.0
mean 30.0
std 5.0
min 25.0
25% 27.5
50% 30.0
75% 32.5
max 35.0
(3, 3)
Index(['Name', 'Age', 'City'], dtype='object')
2. 데이터 선택 (인덱싱 및 슬라이싱)
# 특정 컬럼 선택print(df['Name'])# 여러 개의 컬럼 선택print(df[['Name', 'Age']])# 특정 행 선택 (iloc 사용: 위치 기반 인덱싱)print(df.iloc[0]) # 첫 번째 행 출력print(df.iloc[1:3]) # 1~2번째 행 출력# 특정 행 선택 (loc 사용: 라벨 기반 인덱싱)print(df.loc[0]) # 첫 번째 행 출력print(df.loc[:, ['Name', 'Age']]) # 모든 행에서 'Name'과 'Age' 컬럼 선택
0 Alice
1 Bob
2 Charlie
Name: Name, dtype: object
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
Name Alice
Age 25
City Seoul
Name: 0, dtype: object
Name Age City
1 Bob 30 Busan
2 Charlie 35 Incheon
Name Alice
Age 25
City Seoul
Name: 0, dtype: object
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
iloc[]은 숫자 인덱스를 기반으로 데이터를 선택
loc[]은 라벨(컬럼명, 인덱스명)을 기반으로 데이터를 선택
데이터 입출력
Pandas는 다양한 파일 형식의 데이터를 읽고 저장할 수 있는 기능을 제공한다.
CSV, Excel, JSON 파일 읽기 및 저장
1. CSV 파일 입출력
CSV(Comma-Separated Values)는 가장 많이 사용되는 데이터 저장 형식 중 하나이다.
import pandas as pd# CSV 파일 읽기df = pd.read_csv('data.csv') # 기본적으로 첫 번째 행을 컬럼명으로 인식print(df.head()) # 상위 5개 행 출력# CSV 파일 저장df.to_csv('output.csv', index=False) # index=False 옵션을 사용하면 인덱스 저장 안 함
read_csv() 함수는 CSV 파일을 DataFrame으로 변환
to_csv() 함수는 DataFrame을 CSV 파일로 저장
2. Excel 파일 입출력
Excel 파일은 .xlsx 확장자로 저장되며, Pandas는 openpyxl 라이브러리를 사용하여 엑셀 데이터를 처리할 수 있다.
# Excel 파일 읽기df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 특정 시트 읽기print(df.head())# Excel 파일 저장df.to_excel('output.xlsx', sheet_name='Result', index=False)
sheet_name 옵션을 사용하여 특정 시트의 데이터를 불러올 수 있음
엑셀 파일을 저장할 때도 index=False 옵션을 활용하여 인덱스 저장을 방지할 수 있음
3. JSON 파일 입출력
JSON(JavaScript Object Notation)은 웹에서 데이터를 주고받을 때 많이 사용하는 형식이다.
# JSON 파일 읽기df = pd.read_json('data.json')print(df.head())# JSON 파일 저장df.to_json('output.json', orient='records', lines=True) # 줄 단위 저장 (개별 JSON 객체)
orient='records'를 사용하면 리스트 형태로 저장됨
lines=True를 추가하면 각 행이 별도의 JSON 객체로 저장됨
SQL 데이터베이스 연결
Pandas는 sqlite3 또는 SQLAlchemy를 사용하여 SQL 데이터베이스와 연동할 수 있다.
import sqlite3# SQLite 데이터베이스 연결conn = sqlite3.connect('example.db')# SQL 쿼리를 이용하여 데이터 읽기df = pd.read_sql_query("SELECT * FROM users", conn)print(df.head())# DataFrame을 SQL 테이블로 저장df.to_sql('users_backup', conn, if_exists='replace', index=False)
pd.read_sql_query()를 사용하면 SQL 쿼리 결과를 DataFrame으로 변환 가능
df.to_sql()을 이용해 DataFrame을 데이터베이스 테이블로 저장할 수 있으며, if_exists='replace'를 설정하면 기존 데이터를 덮어쓴다.
웹 데이터 가져오기
웹에서 데이터를 가져올 때는 read_html() 또는 requests와 BeautifulSoup을 사용할 수 있다.
1. HTML 테이블 데이터 가져오기
url ='https://example.com/table_page'df_list = pd.read_html(url) # 웹 페이지 내 모든 테이블을 리스트로 반환df = df_list[0] # 첫 번째 테이블 선택print(df.head())
pd.read_html()은 HTML 페이지에서 <table> 태그를 자동으로 찾아 DataFrame으로 변환
2. 웹 스크래핑 (requests + BeautifulSoup)
웹 페이지에서 특정 데이터를 가져오려면 requests와 BeautifulSoup을 사용할 수 있다.
import requestsfrom bs4 import BeautifulSoupurl ='https://example.com'response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 특정 요소 가져오기 (예: 제목 텍스트)titles = soup.find_all('h2')for title in titles:print(title.text)
requests.get()을 사용하여 웹 페이지의 HTML을 가져오고, BeautifulSoup을 사용해 원하는 요소를 추출
데이터 탐색 및 전처리
데이터를 분석하기 전에 데이터의 구조를 이해하고, 결측값이나 중복 데이터를 정리하는 과정이 필요하다.
Name Age Salary
3 David NaN 80000
2 Charlie 35.0 70000
1 Bob 30.0 60000
0 Alice 25.0 50000
여러 개의 컬럼 기준으로 정렬하려면 df.sort_values(by=['Age', 'Salary']) 사용
2. 데이터 필터링
df_filtered = df[df['Age'] >30] # 30세 이상 데이터만 선택print(df_filtered)
Name Age Salary
2 Charlie 35.0 70000
여러 조건을 조합하려면 df[(df['Age'] > 30) & (df['Salary'] > 60000)]을 사용
데이터 변환 및 조작
데이터 분석을 위해 데이터프레임의 특정 부분을 선택하고, 필요한 변형을 수행하는 것이 중요하다.
데이터프레임 인덱싱 및 슬라이싱
Pandas에서 데이터를 선택하는 방법은 loc[], iloc[], 직접 컬럼명을 지정하는 방식 등이 있다.
1. 단일 컬럼 선택
import pandas as pddata = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'Salary': [50000, 60000, 70000]}df = pd.DataFrame(data)# 특정 컬럼 선택print(df['Name']) # Series 형태 반환print(df[['Name', 'Age']]) # DataFrame 형태 반환
0 Alice
1 Bob
2 Charlie
Name: Name, dtype: object
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
2. 행 선택
행 선택하는 방법에는 라벨 기반으로 선택하는 loc[], 위치(숫자) 기반으로 선택하는 iloc[]가 있다.
# 라벨(이름) 기반 선택print(df.loc[0]) # 첫 번째 행 선택print(df.loc[:, ['Name', 'Salary']]) # 모든 행에서 특정 열 선택# 위치(숫자) 기반 선택print(df.iloc[1]) # 두 번째 행 선택print(df.iloc[0:2, 1:3]) # 첫 번째~두 번째 행, 두 번째~세 번째 열 선택
Name Alice
Age 25
Salary 50000
Name: 0, dtype: object
Name Salary
0 Alice 50000
1 Bob 60000
2 Charlie 70000
Name Bob
Age 30
Salary 60000
Name: 1, dtype: object
Age Salary
0 25 50000
1 30 60000
loc[]은 라벨(컬럼명, 인덱스명) 기반
iloc[]은 숫자 인덱스 기반
행과 열 추가 및 삭제
1. 행 추가
df.loc[3] = ['David', 40, 80000] # 새 행 추가print(df)
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
3 David 40 80000
2. 열 추가
df['Bonus'] = df['Salary'] *0.1# 기존 컬럼을 활용해 새 컬럼 생성print(df)
Name Age Salary Bonus
0 Alice 25 50000 5000.0
1 Bob 30 60000 6000.0
2 Charlie 35 70000 7000.0
3 David 40 80000 8000.0
3. 행 삭제
# (`drop`)df = df.drop(1) # 인덱스 1인 행 삭제print(df)
Name Age Salary Bonus
0 Alice 25 50000 5000.0
2 Charlie 35 70000 7000.0
3 David 40 80000 8000.0
Name object
Age int64
Salary int64
JoinDate datetime64[ns]
dtype: object
Apply 함수 활용
apply() 함수는 행 또는 열 단위로 함수를 적용할 때 사용한다.
1. 각 행에 함수 적용 (열 기준)
df['Salary After Tax'] = df['Salary'].apply(lambda x: x *0.8) # 세금 20% 공제print(df)
Name Age Salary JoinDate Salary After Tax
0 Alice 25 50000 2023-01-01 40000.0
2 Charlie 35 70000 2022-12-15 56000.0
3 David 40 80000 2021-08-10 64000.0
2. 각 행 또는 열을 기준으로 연산
# (`axis` 옵션 사용)def categorize_age(age):return'Young'if age <30else'Old'df['Age Group'] = df['Age'].apply(categorize_age)print(df)
Name Age Salary JoinDate Salary After Tax Age Group
0 Alice 25 50000 2023-01-01 40000.0 Young
2 Charlie 35 70000 2022-12-15 56000.0 Old
3 David 40 80000 2021-08-10 64000.0 Old
apply()를 활용하면 복잡한 연산을 손쉽게 처리할 수 있다.
데이터 집계 및 그룹화
Pandas는 데이터를 효과적으로 요약하고 분석할 수 있는 다양한 집계 및 그룹화 기능을 제공한다.
기본 통계 함수
Pandas는 데이터의 기본적인 통계값을 계산하는 다양한 함수(mean, sum, count 등)를 제공한다.
df_outer = pd.merge(df_a, df_b, on='ID', how='outer') # 전체 데이터 포함df_left = pd.merge(df_a, df_b, on='ID', how='left') # df_a 기준 병합df_right = pd.merge(df_a, df_b, on='ID', how='right') # df_b 기준 병합print(df_outer)print(df_left)print(df_right)
ID Name Salary
0 1 Alice 50000.0
1 2 Bob 60000.0
2 3 Charlie NaN
3 4 NaN 70000.0
ID Name Salary
0 1 Alice 50000.0
1 2 Bob 60000.0
2 3 Charlie NaN
ID Name Salary
0 1 Alice 50000
1 2 Bob 60000
2 4 NaN 70000
Value Value_squared
Category ID
A 1 10 100
B 1 30 900
2 40 1600
A 2 20 400
1 10 100
sample(n=5)를 사용하여 임의의 샘플을 선택할 수 있다.
2. 대용량 데이터 읽기 및 처리
대용량 데이터를 처리할 때는 chunksize 옵션을 사용하여 데이터를 작은 덩어리로 나누어 처리할 수 있다.
chunk_size =100000# 한 번에 처리할 데이터 크기 설정chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)for chunk in chunks:# 각 청크를 처리하는 코드print(chunk.head())
read_csv()의 chunksize를 사용하면 파일을 한 번에 메모리로 로드하지 않고, 작은 부분씩 읽어들이면서 처리할 수 있다.
3. dtypes 최적화
대용량 데이터를 처리할 때는 데이터 타입을 최적화하여 메모리 사용량을 줄일 수 있다. 예를 들어, float64를 float32로 변경하면 메모리 사용을 절감할 수 있다.
df['Value'] = df['Value'].astype('float32') # 데이터 타입 최적화