관리 메뉴

공부 기록장 💻

[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:30

Python 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
반응형
Comments