본문 바로가기
데이터 분석

[Pandas/skiprows] 데이터 중간부터 읽어오기

by 빅데이터1020 2021. 7. 4.
SMALL

chunksize 로 나눠서 데이터를 읽어오다가 중간에 data truncated 오류가 났습니다.

MySQL에 오류 수정을 하고 다시 데이터를 읽어들이려니, 중간부터 시작해야 했습니다.

 

데이터 중간부터 읽어오는 법 포스트입니다.

 

방법

판다스에서 pandas.read_csv() 함수의 옵션을 활용하면 됩니다.

 

 

pandas.read_csv — pandas 1.3.0 documentation

Delimiter to use. If sep is None, the C engine cannot automatically detect the separator, but the Python parsing engine can, meaning the latter will be used and automatically detect the separator by Python’s builtin sniffer tool, csv.Sniffer. In addition

pandas.pydata.org

그 중에 제가 필요했던 옵션은 아래 세 가지 입니다.

(1) header

- 첫 행을 컬럼으로 지정할지 여부

- default는 첫 행을 컬럼으로 지정합니다. header=None 을 하면 컬럼으로 지정하는 행이 없게 합니다.

- header=0 이라고 하면 원본 데이터의 첫 행을 컬럼으로 지정해주는건가 싶었지만,

  중간부터 읽어들이기 때문에 그렇지 않았습니다.

- 예를 들어, 51행부터 읽어들인다 했을 때,

  header=0 이라고 하면, 51번째 행을 컬럼으로 지정하고 52번째 행부터 값으로 읽어들입니다.

- 그래서 header=None으로 지정한 후 names 에서 컬럼을 지정해주었습니다.

          

(2) names

- 컬럼으로 사용할 이름을 리스트로 입력합니다.

 

(3) skiprows

몇번째 행까지 스킵할 것인지 설정합니다.

5번째 행까지 스킵하고 6번째 행부터 읽어들이고 싶으면

skiprows=5 라고 하면 됩니다.

 

 

예시 코드

for cnt, chunk in enumerate(pd.read_csv(filename,
                                        sep="|",
                                        encoding='utf-8',
                                        header=None,
                                        names=['nt','v2','v3','gb3','gb2','ta_ym','daw_ccd_r',
                                               'apv_ts_dl_tm_r', 'vlm', 'usec', 'v1'],
                                        skiprows=2730000,
                                        chunksize=chunksize)):
    tosql(chunk)
    print(cnt, "회 진행 중===")

저는 2,730,000 행까지 스킵하고

2,730,001 행부터 데이터를 읽어들이고 싶었습니다.

 

tosql()함수는 제가 지정한 함수에요.

 

위의 코드에서 for문의 chunk와 tosql(), print()의 의미는 아래 포스트에서 더 자세히 확인할 수 있습니다.

 

[Pandas/Chunksize] 큰 용량 데이터 읽어오기

2021년 문화관광 빅데이터 분석대회에 도전하게 되었습니다. 분석용 데이터를 열어보려는데, 용량이 무려 4GB가 넘었습니다. 컬럼이 12개인데 용량이 4GB면 row 수가 어마어마할 거라는 생각이 들었

data-analysis-expertise.tistory.com

 

LIST