[Pandas 기초] 다양한 데이터 읽고(read) 쓰기(write)

업데이트:

개요

jpg

데이터를 분석하려면 데이터를 먼저 불러올 줄 알아야한다. 불러올 파일의 형식과 파일의 구조들을 이해하고 각각에 맞는 함수를 이용해 데이터를 불러오는 방법에 대해 알아보자.


1. csv파일 읽고 쓰기

1-1. 쓰기(to_csv)

먼저 데이터프레임을 다음과 같이 만들고 csv 파일을 저장해보자.

import pandas as pd

df = pd.DataFrame({'c0':[0,1,2],'c1':[1,2,3],'c2':[4,5,6],'c3':[7,8,9]})
df.to_csv("test.csv", index=False)
print(df)
[Output]
   c0  c1  c2  c3
0   0   1   4   7
1   1   2   5   8
2   2   3   6   9

index=False옵션은 위의 출력된 데이터프레임에 자동으로 추가된 인덱스 없이 저장해준다.
header옵션의 별도 지정이 없으면 첫 행의 데이터가 열 이름이 된다.

1-2. 읽기(read_csv)

이제 다시 read_csv()를 이용해 읽어와보자.

df1 = pd.read_csv("test.csv")
print(df1)
[Output]
   c0  c1  c2  c3
0   0   1   4   7
1   1   2   5   8
2   2   3   6   9

아무 옵션을 주지 않으면 같은 형태로 불러와진다. 아까 to_csv()함수로 csv를 내보낼때 index=False옵션을 주지 않았다면 0,1,2열이 하나 더 생겼을 것이다.

df2 = pd.read_csv("test.csv",header=None)
print(df2)
[Output]
    0   1   2   3
0  c0  c1  c2  c3
1   0   1   4   7
2   1   2   5   8
3   2   3   6   9

read_csv()함수는 기본적으로 첫번째 행을 header(열이름)로 지정해서 불러온다.
하지만 불러올 데이터가 header가 없을 경우 header=None옵션을 주어야한다.

df3 = pd.read_csv("test.csv",index_col='c0')
print(df3)
print('\n')
[Output]
    c1  c2  c3
c0            
0    1   4   7
1    2   5   8
2    3   6   9

index_col 옵션은 디폴트 값이 None 이고, 이는 새로운 정수 인덱스 0,1,2,..를 생성한다.
위와 같이 index_col='c0'을 옵션으로 줄 경우 c0열을 인덱스로 불러온다.

df4 = pd.read_csv("test.csv",names=['1열','2열','3열','4열'])
print(df4)
[Output]    
   1열  2열  3열  4열
0  c0  c1  c2  c3
1   0   1   4   7
2   1   2   5   8
3   2   3   6   9

name=['열이름1','열이름2',...]옵션을 통해 열이름을 따로 설정해 줄 수 있다.

1-3. 다양한 옵션

이렇게 read_csv()안에 설정해 줄 수 있는 옵션은 실제로 엄청나게 많다. 물론 이 옵션들의 일부는 일단 읽어온 후에 다른 과정을 거쳐서 만들수도 있지만, 애초에 읽어올때 이런 옵션을 잘 알고 있는다면 부가적인 작업을 최소화 할 수 있다.

read_csv()의 다양한 옵션은 판다스 공식홈페이지에서 상세하게 알려주고 있다.

많이쓰는 옵션만 간단히 정리해보았다.

옵션 default 설명
sep ’,’ 자료의 구분 기준을 설정
header ‘infer’ 첫행을 열이름으로 쓸 것인지
names - 열이름을 리스트로 입력해 줄 수있다. (header=None으로 자동 설정)
index_col None 특정 열이름으로 인덱스를 지정
prefix - header가 없는 경우, ‘V’를 넣으면, V0,V1순으로 열이름 부여
dtype - 개별 열 또는 모든 열의 타입을 지정(e.g ‘str’, {‘a’: np.float64, ‘c’: ‘Int64’})
na_values - 결측값으로 인식할 문자열 지정
keep_default_na True 결측값(NaN)을 포함할지 여부 결정
na_filter True 결측값 탐지
skip_blank_lines True 빈줄은 결측값으로 판단하지 않고 건너뜀
encoding - 참고
nrow - 읽을 파일 행(row)의 수


2. Excel 파일 읽기

xlsx또는 xls확장자의 엑셀파일을 읽어오려면 read_excel() 함수를 이용하면 된다.
이번에는 통계청(KOSIS)에서 제공하는 남북한발전전력량 데이터를 로컬에 저장해놓고 읽어와보자.

import pandas as pd
df1 = pd.read_excel("남북한발전전력량.xlsx")
df1.head()
남북한별 발전 전력별 2015 2015.1 2016 2016.1 2017 2017.1
0 남북한별 발전 전력별 전력량 (억㎾h) 구성비 (%) 전력량 (억㎾h) 구성비 (%) 전력량 (억㎾h) 구성비 (%)
1 북한 합계 190 100 239 100 235 100
2 NaN 수력 100 52.6 128 53.6 119 50.6
3 NaN 화력 90 47.4 111 46.4 116 49.4
4 남한 합계 5281 100 5404 100 5535 100

여러개의 데이터프레임을 하나의 Excel 파일로 저장하기

Excel에는 csv와는 달리 sheet가 존재한다. ExcelWriter을 활용하면 개별 sheet에 각각 데이터를 export 할 수 있다.
데이터분석에는 주로 csv가 많이 활용되지만, 문서정리할때 유용하게 사용된다.

import pandas as pd
data1 = {'name' : ['Jerry','Riah','Paul'],
        'algol' : ['A','A+','B'],
        'basic' : ['C','B','B+'],
        'c++' : ['B+','C','C+']}

data2 = {'c0':[1,2,3],
        'c1':[4,5,6],
        'c3':[7,8,9],
        'c4':[10,11,12],
        'c5':[13,14,15]}

df1 = pd.DataFrame(data1)
df1.set_index('name', inplace=True)

df2 =pd.DataFrame(data2)
df2.set_index('c0', inplace=True)

print(df1)
print('\n')
print(df2)
[Output]
      algol basic c++
name                 
Jerry     A     C  B+
Riah     A+     B   C
Paul      B    B+  C+


    c1  c3  c4  c5
c0                
1    4   7  10  13
2    5   8  11  14
3    6   9  12  15

df1과 df2를 엑셀 시트 1,2로 각각 저장

writer = pd.ExcelWriter("test_excel.xlsx")
df1.to_excel(writer, sheet_name='1번 시트')
df2.to_excel(writer, sheet_name='2번 시트')
writer.save()

pd.ExcelWriter("test_excel.xlsx")를 해주게되면 해당 파일에 writer변수를 이용해 쓸 준비가 됐다는 의미이다.
작업이 끝나면 writer.save()를 이용해 마무리하면 해당 경로에 엑셀파일이 저장된다.
sheet_name=‘Sheet1’옵션은 디폴트가 ‘Sheet1’으로 되어 있기 때문에, 위처럼 따로 지정해 주지 않으면 덮어 씌워질 뿐이다.


3. Json 파일 읽기

json 형태의 파일을 읽어오려면 read_json()함수를 이용해 불러올 수 있다.
json파일 미리보기(이 파일은 웹크롤링이나 로그데이터에서 주로 만나볼 수 있다).


{
        "site" : {
        "facebook" : "facebook.com/yg_analyst",
        "instagram" : "None",
        "github" : "yg_analyst"
    },
        "info" : {
        "age" : "26",
        "height" : "183",
        "weight" : "80"
    },
        "blog" : {
        "url" : "yganalyst.github.io"
    }
}

[Output]
{'site': {'facebook': 'facebook.com/yg_analyst',
  'instagram': 'None',
  'github': 'yg_analyst'},
 'info': {'age': '26', 'height': '183', 'weight': '80'},
 'blog': {'url': 'yganalyst.github.io'}}

그러면 이제 읽어와보자

import pandas as pd

df = pd.read_json("json_test.json")
print(df)
print('\n')
print(df.index)
print(df.columns)
[Output]
                              site   info                 blog
age                            NaN   26.0                  NaN
facebook   facebook.com/yg_analyst    NaN                  NaN
github                  yg_analyst    NaN                  NaN
height                         NaN  183.0                  NaN
instagram                     None    NaN                  NaN
url                            NaN    NaN  yganalyst.github.io
weight                         NaN   80.0                  NaN


Index(['age', 'facebook', 'github', 'height', 'instagram', 'url', 'weight'], dtype='object')
Index(['site', 'info', 'blog'], dtype='object')


Reference

도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.

댓글남기기