일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 가상면접사례로배우는대규모시스템설계기초
- 카카오
- @Autowired
- 해시
- @Component
- 파이썬
- AWS
- Nodejs
- TypeORM
- thymeleaf
- C++
- 알고리즘
- OpenCV
- git
- C언어
- 구조체배열
- 스프링
- spring boot
- nestjs auth
- 컴포넌트스캔
- 카카오 코테
- python
- 코테
- Spring
- nestJS
- 코딩테스트
- nestjs typeorm
- 시스템호출
- 카카오 알고리즘
- 프로그래머스
Archives
- Today
- Total
공부 기록장 💻
[Python] Python for Data Analysis CH6 Data Loading and Export (Text Format, CSV, JSON) 본문
# Language & Tools/Python
[Python] Python for Data Analysis CH6 Data Loading and Export (Text Format, CSV, JSON)
dream_for 2022. 10. 30. 20:30Python for Data Analysis
CH 6. 데이터 로딩과 저장, 파일 형식
1. 텍스트 파일에서 데이터를 읽고 쓰는 법
- pandas에서 표 형식의 텍스트 데이터를 DataFrame 객체로 읽어오는 몇 가지 기능
- **옵션**
- 색인 : 반환하는 DataFrame에서 하나 이상의 컬럼을 색인으로 지정. 파일이나 사용자로부터 컬럼 이름을 받거나 아무것도 받지 않을 수 있다.
- 자료형 추론과 데이터 변환 : 사용자 정의 값 변환과 비어있는 값을 위한 사용자 리스트를 포함
- 날짜 분석 : 여러 컬럼에 걸쳐 있는 날짜와 시간 정보를 하나의 컬럼에 조합해서 결과 반영
- 반복: 여러 파일에 걸쳐 있는 자료를 반복적으로 읽어옴
- 정제되지 않은 데이터 처리: 로우나 꼬리말, 주석 건너뛰기 또는 천 단위마다 쉼표로 구분된 숫자 같은 사소한 것들의 처리
- **옵션**
데이터 처리 함수
데이터 읽어 오기(Data Loading)
- 타입 추론(Type Inference)
pandas.read_csv
의 경우 데이터 형식에 자료형을 명시하지 않으므로 타입 추론을 수행# CSV 파일들 열어 출력해보기 def read_csv_file(): for i in range(1,8): path = 'examples/ex{0}.csv'.format(i) df = pd.read_csv(path) print(df, end='\n\n\n') # 자동으로 index값 부여 (column이름은 header)
컬럼 지정하기
- 컬럼 이름 자동으로 생성 또는 직접 지정 가능
# 컬럼 이름 자동 생성 (0~)
df = pd.read_csv('examples/ex2.csv', header=None)
# 컬럼 이름 직접 지정
df = pd.read_csv('examples/ex2.csv', names=['a','b','c','d','message'])
- message 컬럼을 색인으로 하는 데이터프레임 반환 →
index_col
인자에 4번째 컬럼 또는 ‘message’이름을 가진 컬럼을 지정해서 색인으로 변경
names=['a','b','c','d','message']
df = pd.read_csv('examples/ex2.csv', names=names, index_col='message')
계층적 색인
- 계층적 색인을 지정하기 (다중 컬럼으로부터 계층적 인덱스 설정하기)
- key1, key2, value1, value2 컬럼들 중 key1과 key2를 인덱스로 설정
def csv_index(): print(pd.read_csv('examples/csv_mindex.csv')) # 다중 컬럼으로부터 계층적 인덱스 설정하기 parsed = pd.read_csv('examples/csv_mindex.csv', index_col=['key1','key2']) print(parsed)
- 고정된 구분자가 없는 경우
- 데이터의 로우보다 컬럼이 하나 적기 때문에
read_table
함수는 첫번째 열이 DataFrame의 객체의 색인(인덱스)라고 추론 - 필드가 여러 개의 공백 문자로 구분되어 있으므로, 정규 표현식
\s+
(whitespace 공백문자 기준으로 자르기) 를 사용하여 처리
# read_table을 이용해 인덱스 추론, 공백 문자를 기준으로 데이터값들 자르기 def re_seperator(): print(list(open('examples/ex3.txt'))) result = pd.read_table('examples/ex3.txt',sep='\s+') print(result)
- 데이터의 로우보다 컬럼이 하나 적기 때문에
skiprows
옵션을 이용해 선택된 로우 제외하기# 로우 제외하기 def skip_rows(): orig = pd.read_csv('examples/ex4.csv') print(orig) ret = pd.read_csv('examples/ex4.csv', skiprows=[0,2,3]) # 0,2,3번 로우 건너뛰기 print(ret)
누락된 값 처리하기
- 텍스트 파일에서 누락된 값은 표기되지 않거나(빈 문자열), 구분하기 쉬 운 특수한 문자로 표기됨 (pandas는 보통 NA나 NULL과 같은 통용되는 문자를 비어잆는 값으로 사용)
# 손실 데이터 처리하기(빈 문자열 NaN)
def missing_data():
ret = pd.read_csv('examples/ex5.csv')
print(ret, end='\\n\\n') # 결측치를 포함하는 파일 (NaN 표시)
print(pd.isnull(ret), end='\\n\\n') # 불린으로 null값 여부 확인
# na_values 옵션으로 손실값 처리
result = pd.read_csv('examples/ex5.csv', na_values=['NULL'])
print(result, end='\\n\\n')
# 컬럼마다 다른 NA문자를 사전값으로 넘겨 처리 (message 컬럼의 foo와 NA, something 컬럼의 two)
sentinels = {'message':['foo','NA'], 'something':['two']}
print(pd.read_csv('examples/ex5.csv', na_values=sentinels))
read_csv, read_table 함수의 옵션
텍스트 파일 조금씩 읽어오기
- 매우 큰 파일을 처리할 때 인자를 제대로 주었는지 알아보기 위해, 파일의 일부분만 읽어보거나 여러 파일 중 몇 개의 파일만 읽어서 확인할 경우가 있다.
- 큰 파일을 다루기 전 pandas의 출력 설정을 다음과 같이 정할 수 있다.
def read_parts(): pd.options.display.max_rows=10 # 최대 10개의 데이터만 출력 result = pd.read_csv('examples/ex6.csv') print(result, end='\n\n')
nrows
옵션으로 설정하여 파일에서 지정된 로우만큼 읽어오기# nrows 옵션 설정하기 print(pd.read_csv('examples/ex6.csv', nrows=5))
- 로우의 줄 수를 청크 크기로 지정하고, 청크 단위로 읽어 오기
chunksize
을 지정하여 read_csv에서 반환된 TextParser 객체를 이용해 chunksize에 따라 분리된 파일들을 순회할 수 있다.- ex6.csv 파일을 순회하며 ‘key’ 로우에 있는 값을 세어보자.
# 파일을 여러 조각으로 나누어 읽기 def read_chunk(): chunker = pd.read_csv('examples/ex6.csv', chunksize=1000) # chunksize를 1000으로 설정 print(chunker) # TextParser 객체 반환 # Series 객체 tot에 chuncker의 요소들의 'key' 로우에 있는 값 세어보기 tot = pd.Series([]) for piece in chunker: tot = tot.add(piece['key'].value_counts(), fill_value=0) # tot을 내림차순으로 정렬 tot = tot.sort_values(ascending=False) print(tot[:10])
데이터를 텍스트 형식으로 기록하기 (Data Export)
- 데이터를 구분자로 구분한 형식으로 내보내기
sep
옵션으로 구분자 지정하기na_rep
옵션으로 누락된 값 표시할 문자열 지정하기index=False
,header=False
옵션 지정하여 로우, 컬럼 이름을 포함하지 않을 수 있음columns
옵션으로 컬럼의 일부분만 기록하고 순서를 지정 가능
# csv 파일로 저장
def to_csv_export():
data = pd.read_csv('examples/ex5.csv')
print(data, end='\\n\\n')
# to_csv 메서드 이용하여 데이터를 쉼표로 구분된 형식으로 파일에 쓰기
data.to_csv('examples/out.csv')
# 파일에 기록하지 않고 sys.stdout으로 모니터 콘솔에 텍스트 결과 출력하기
import sys
data.to_csv(sys.stdout, sep='|')
# 출력에서 손실된값은 빈 문자열로 나타내기
data.to_csv(sys.stdout, na_rep='NULL')
# 옵션 지정하지 않을 경우 컬럼과 색인 모두 생략하여 표시
data.to_csv(sys.stdout, index=False, header=False)
# 컬럼의 일부분만 기록하고, 순서 지정
data.to_csv(sys.stdout, index=False, columns=['a','c', 'b'])
- Series객체를
to_csv
메서드를 이용해 파일에 기록하기
# Series 객체를 csv로 기록
def series_to_csv():
import numpy as np
# 2000-01-01 부터 2000-01-07까지 날짜 객체 생성
dates = pd.date_range('1/1/2000', periods=7)
# 0부터 6까지 Series 객체 생성 (index는 dates로 지정)
ts = pd.Series(np.arange(7), index=dates)
print(ts)
ts.to_csv('examples/tseries.csv') # 파일에 저장
print(pd.read_csv('examples/tseries.csv'))
구분자 형식 다루기
- pandas.read_table 함수를 이용해 디스크에 표 형태로 저장된 대부분의 파일 형식을 불러올 수 있지만, 수동으로 처리해야 하는 경우도 있다.
- 데이터를 불러오는데 실패하게끔 만드는 잘못된 라인이 포함되어 있는 데이터를 전달 받는 경우도 종종 있다.
- 구분자가 한 글자인 파일은 내장 csv 모듈을 이용해 처리할 수 있다.
# 구분자 형식 다루기
def separator():
import csv # 파이썬 내장 csv 모듈 사용
path = 'examples/ex7.csv'
f = open(path)
reader = csv.reader(f) # csv.reader 함수에 파일 객체 넘기기
for line in reader:
print(line) # 큰 따옴표가 제거된 튜플 얻기
- 데이터를 원하는 형식의 출력 파일로 구성하기 (zip 함수 이용하여 데이터 컬럼 사전 만들기)
# 원하는 형태로 데이터 넣기
with open(path) as file:
lines = list(csv.reader(file))
header, values = lines[0], lines[1:]
# 사전 표기법과 로우를 컬럼으로 전치해주는 zip(*values) 이용해 데이터 컬럼 사전 만들기
data_dict = {h:v for h,v in zip(header,zip(*values))} # header: 컬럼, values: 데이터
print(data_dict)
- csv.wirter 메소드를 사용해 구분자를 가진 파일 생성하기
- pandas 객체를 통해 전체 데이터를 다룰 수 있기 때문에, csv 모듈 사용보다는 pdnadas를 활용한 파일 생성이 훨씬 효율적이다.
# csv.writer 메소드를 사용해 구분자를 가진 파일 생성
def separator_writer():
import csv # 파이썬 내장 csv 모듈 사용
with open('examples/mydata.csv','w') as f:
# 한 줄씩 데이터를 write해야 함
writer = csv.writer(f, dialect='excel')
writer.writerow(('one','two','three'))
writer.writerow(('1','2','3'))
writer.writerow(('4','5','6'))
writer.writerow(('7','8','9'))
JSON 문자열 다루기
- ****JSON(Javascript Object Notation)**** : 웹 브라우저와 다른 애플리케이션이 HTTP 요청으로 데이터를 보낼 때 널리 사용하는 표준 파일 형식
- CSV 같은 표 형식의 텍스트보다 좀 더 유연한 데이터 형식
- 기본 자료형으로는 객체(사전), 배열(리스트), 문자열, 숫자, 불리언, Null 을 포함
- NoSQL 데이터 (대표적으로 MongoDB - mobile side에서 자주 사용되는 DB) 를 다루는데 유용
- 파이썬 표준 라이브러리 json 을 사용해 json 데이터를 처리해보자.
- json.loads() : json 문자열을 파이썬 형태로 변환하기
- json.dumps() : 파이썬 객체를 JSON으로 변환
# JSON 데이터 다루기
def json_data():
# obj에 json 객체 저장하기
obj = """
{
"name":"Wes",
"places_lived":["US", "Spain", "Germany"],
"pets":None,
"siblings":[
{
"name":"Scott",
"age":30,
"pets":["Zeus", "Zuco"]
},
{
"name":"Katie",
"age":38,
"pets":["Stache","Cisco"]
}
]
}
"""
# Json 문자열을 파이썬 형태로 변환하기 위한 함수 json.loads
result = json.loads(obj)
print(result['name'])
asjson = json.dumps(result) # 파이썬 객체를 JSON 형태로 변환
print(asjson)
sibings = pd.DataFrame(result['siblings'], columns=['name','age'])
- to_json() : pandas 데이터를 json으로 저장하기 **
def json_data_practice():
data = pd.read_json('examples/example.json') # Json 데이터 읽기
print(data)
# pandas 데이터를 json으로 저장하기 : to_json() 함수
print(data.to_json())
print(data.to_json(orient='records'))
728x90
반응형
'# Language & Tools > Python' 카테고리의 다른 글
Comments