TIL/Python

Python Library - Pandas를 이용한 데이터를 불러오고 저장하기

beady 2024. 11. 27. 15:44

판다스는 데이터를 처리하기 위한 패키지이다.

이러한 데이터 처리를 위해 어떻게 파일을 불러오고 다시 저장하는지,

원하는 데이터를 선택하려면 어떤 방법이 있는지에 대해 알아보도록 하자.

 

- 판다스를 이용한 다양한 형식의 파일 불러오기

# 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
"""