판다스는 데이터를 처리하기 위한 패키지이다.
이러한 데이터 처리를 위해 어떻게 파일을 불러오고 다시 저장하는지,
원하는 데이터를 선택하려면 어떤 방법이 있는지에 대해 알아보도록 하자.
- 판다스를 이용한 다양한 형식의 파일 불러오기
# CSV 파일 불러오기
df_csv = pd.read_csv('data.csv')
# URL에서 CSV 파일 불러오기
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
df_csv_2 = pd.read_csv(url)
# Excel 파일 불러오기
df_excel = pd.read_excel('data.xlsx')
# Excel 특정 시트 데이터 불러오기
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet2')
# JSON 파일 불러오기
df_json = pd.read_json('data.json')
- 다양한 형식의 데이터로 저장하기
# CSV 파일로 저장하기
df.to_csv('data.csv', index=False) # 인덱스를 제외하고 저장
# Excel 파일로 저장하기
df.to_excel('data.xlsx', index=False)
# JSON 파일로 저장하기
df.to_json('data.json')
# to 함수로 URL에 저장 할 수는 X
- 상위 및 하위 데이터 미리보기
# 데이터프레임 내의 처음 n줄의 데이터 출력 (기본값 n=5)
df.head(n)
# 데이터프레임 내의 마지막 n줄의 데이터 출력 (기본값 n=5)
df.tail(n)
# 데이터프레임 내의 데이터 중 무작위로 가져옴
df.sample() # 하나의 샘플 가져옴
df.sample(n) # n개의 샘플 가져옴
- 데이터프레임의 기본 정보 확인하기
df.info() # 데이터프레임의 요약 정보 확인
# 전체 구조를 한눈에 보여줌
# 각 열의 데이터 타입 및 널 값 여부 확인 가능
df.describe() # 숫자형 데이터에 대한 주요 통계 정보 제공
# 평균, 표준편차, 최솟값, 최댓값 등
for i in df.columns:
print(df[i].describe()) # 특정 열에 대한 주요 통계 정보 확인
df.shape # 데이터프레임의 행과 열 개수 확인
df.dtypes # 데이터 타입만 간략하게 확인
df.columns # 데이터프레임 열의 이름 확인
df.index # 데이터프레임의 인덱스 확인
- 데이터프레임의 개별 데이터 확인하기
loc(location) : 라벨(인덱스, 컬럼명)을 사용해 조회
iloc(integer location) : integer(정수)로 이루어진 행이나 열 번호를 사용해 조회
위처럼 풀네임으로 기억하면 헷갈리는 경우가 덜 할 것 같다.
# loc[]은 라벨(인덱스, 컬럼명)을 사용해 특정 데이터 조회
# 특정 행 조회
print(df.loc[0]) # 첫 번째 행 조회
# 특정 행과 열 조회
print(df.loc[0, 'name']) # 첫 번째 행의 'name' 열 데이터 조회
# iloc[]은 정수 인덱스를 사용해 데이터 조회
# 첫 번째 행 조회
print(df.iloc[0])
# 첫 번째 행의 두 번째 열 데이터 조회
print(df.iloc[0, 1])
# 슬라이싱 규칙의 차이
# loc은 끝 지점을 포함하지만, iloc은 포함하지 않음에 주의
# 특정 열 전체 선택해서 조회
print(df['name']) # 'name' 열 전체 조회
# 여러 열 선택해서 조회
print(df[['name', 'age']]) # 'name'과 'age' 열 전체 조회(여러 열 조회는 리스트의 형태로 전달)
판다스에서 인덱스, 열, 행을 지정하고 데이터를 가져오는 방법
- set_index()를 사용해 특정 열을 인덱스로 설정하기
import pandas as pd
# 데이터프레임 생성
data = {
'이름': ['철수', '영희', '민수'],
'나이': [25, 30, 35],
'직업': ['학생', '회사원', '프리랜서']
}
df = pd.DataFrame(data)
print(df)
"""
이름 나이 직업
0 철수 25 학생
1 영희 30 회사원
2 민수 35 프리랜서
"""
df2 = df.set_index('이름') # '이름' 열을 인덱스로 설정
print(df2)
"""
나이 직업
이름
철수 25 학생
영희 30 회사원
민수 35 프리랜서
"""
# 인덱스로 설정한 열을 기존 열에서도 제외하지 않고 출력하는 방법
df3 = df.set_index('나이', drop=False)
print(df3)
"""
이름 나이 직업
이름
철수 철수 25 학생
영희 영희 30 회사원
민수 민수 35 프리랜서
"""
- loc[]을 사용해 인덱스로 데이터 선택하기
print(df2)
"""
나이 직업
이름
철수 25 학생
영희 30 회사원
민수 35 프리랜서
"""
# '민수'의 데이터 선택하기
df2.loc["민수"]
"""
나이 35
직업 프리랜서
Name: 민수, dtype: object
"""
# '철수'와 '영희'의 데이터 선택하기
df2.loc[["철수", "영희"]]
"""
나이 직업
이름
철수 25 학생
영희 30 회사원
"""
- 열을 지정해서 데이터 선택하기
print(df2)
"""
나이 직업
이름
철수 25 학생
영희 30 회사원
민수 35 프리랜서
"""
df2["나이"] # "나이" 열 선택
"""
이름
철수 25
영희 30
민수 35
Name: 나이, dtype: int64
"""
- 행을 지정하여 데이터 선택하기
print(df2)
"""
나이 직업
이름
철수 25 학생
영희 30 회사원
민수 35 프리랜서
"""
df2.iloc[0] # 첫 번째 행 선택
"""
나이 25
직업 학생
Name: 철수, dtype: object
"""
df2.loc["영희"] # "영희"의 데이터 행 선택
"""
나이 30
직업 회사원
Name: 영희, dtype: object
"""
판다스에서 필터링과 데이터 타입을 변환하는 방법
- 기본 조건부 필터링
- 여러 조건을 사용한 필터링(&, | 연산자 사용)
data = {
'이름': ['철수', '영희', '민수', '지수'],
'나이': [25, 30, 22, 35],
'직업': ['학생', '회사원', '학생', '프리랜서']
}
df = pd.DataFrame(data)
print(df)
"""
이름 나이 직업
0 철수 25 학생
1 영희 30 회사원
2 민수 22 학생
3 지수 35 프리랜서
"""
# 나이가 25 이상인 행만 선택
df[df['나이'] >= 30] # 데이터프레임이름[조건식]
"""
이름 나이 직업
1 영희 30 회사원
3 지수 35 프리랜서
"""
# 나이가 30 이상이고, 직업이 '프리랜서'인 행만 선택
df[(df['나이'] >= 30) & (df['직업'] == '프리랜서')]
"""
이름 나이 직업
3 지수 35 프리랜서
"""
- isin() 을 사용한 필터링
- ~ 연산자를 사용한 반대 조건 필터링
print(df)
"""
이름 나이 직업
0 철수 25 학생
1 영희 30 회사원
2 민수 22 학생
3 지수 35 프리랜서
"""
# 직업이 '학생' 또는 '회사원'인 행 선택
df[df['직업'].isin(['학생', '회사원'])]
"""
이름 나이 직업
0 철수 25 학생
1 영희 30 회사원
2 민수 22 학생
"""
# 직업이 '학생'이 아닌 행 선택
print(df[~(df['직업'] == '학생')])
"""
이름 나이 직업
1 영희 30 회사원
3 지수 35 프리랜서
"""
데이터 타입을 확인하고 필요에 따라 변환하기
- dtype으로 데이터 타입 확인
- astype() 을 사용한 데이터 타입 변환
print(df)
"""
이름 나이 직업
0 철수 25 학생
1 영희 30 회사원
2 민수 22 학생
3 지수 35 프리랜서
"""
# dtype으로 각 열의 데이터 타입 확인
df.types
"""
이름 object
나이 int64
직업 object
dtype: object
"""
# astype()을 사용한 데이터 타입 변환
# '나이'열을 int에서 float으로 변환
df['나이'].astype(float)
"""
0 25.0
1 30.0
2 22.0
3 35.0
Name: 나이, dtype: float64
"""
※ NaN 값은 타입 변환이 불가함에 주의해야 합니다.
- pd.to_datetime() 함수를 이용해 날짜 타입으로 변환
data = {
'이름': ['철수', '영희', '민수'],
'가입일': ['2023-01-01', '2022-12-15', '2023-05-22']
}
df = pd.DataFrame(data)
print(df)
"""
이름 가입일
0 철수 2023-01-01
1 영희 2022-12-15
2 민수 2023-05-22
"""
# '가입일'을 날짜 타입으로 변환
df['가입일'] = pd.to_datetime(df['가입일'])
print(df.dtypes)
"""
이름 object
가입일 datetime64[ns]
dtype: object
"""
- 카테고리로 데이터 변환
print(df)
"""
이름 나이 직업
0 철수 25 학생
1 영희 30 회사원
2 민수 22 학생
3 지수 35 프리랜서
"""
df['직업'] = df['직업'].astype('category')
df.types
"""
이름 object
나이 int64
직업 category
dtype: object
"""