[Pandas 기초] 다양한 데이터 읽고(read) 쓰기(write)
업데이트:
개요
데이터를 분석하려면 데이터를 먼저 불러올 줄 알아야한다. 불러올 파일의 형식과 파일의 구조들을 이해하고 각각에 맞는 함수를 이용해 데이터를 불러오는 방법에 대해 알아보자.
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
도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.
댓글남기기