Pandas read_csv()에서 Python 예와 함께
⚡ 스마트 요약
Pandas의 `read_csv()` 함수는 로컬 또는 원격의 쉼표로 구분된 파일을 한 번의 호출로 DataFrame으로 변환합니다. 이 예제에서는 UCI 성인 인구 조사 데이터셋을 가져와 15개의 열에 이름을 지정하고, `groupby` 집계를 사용하여 결과를 요약합니다.
Pandas에서 CSV 가져오기
TensorFlow 튜토리얼을 진행하는 동안 다음을 사용하게 됩니다. 성인 데이터 세트이는 분류 작업에 자주 사용됩니다. 아래에 사용된 파일은 원본 파일입니다. adult.data UCI 머신러닝 저장소에서 내보낸 데이터셋이며, 데이터셋 페이지에서는 압축된 다운로드 파일도 제공합니다. ucimlrepo 직접 경로가 더 이상 확인되지 않으면 패키지를 생성합니다.
데이터는 CSV 형식으로 저장되어 있습니다. 데이터 세트에는 8개의 범주형 변수가 포함되어 있습니다.
- 작업반
- 교육
- 결혼의
- 직업
- 관계
- 경주
- 섹스
- 원주민_국가
그리고 6개의 연속 변수:
- 나이
- fnlwgt
- education_num
- 자본 이득
- 자본 손실
- 시간_주
소득과 함께 label 컬럼, 즉 전달할 15개의 컬럼 이름이 됩니다. 판다 다음 절에서.
팬더 read_csv() 메서드
CSV 데이터셋을 가져오려면 `pd.read_csv()` 객체를 사용할 수 있습니다. 기본 시그니처는 다음과 같습니다.
팬더 read_csv() 구문
pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
- 파일 경로 또는 버퍼: 길, URL또는 데이터를 담고 있는 파일과 유사한 객체
- sep=',': 사용할 구분자
- 이름=없음열 이름을 지정하세요. 데이터 세트에 열이 10개 있다면 10개의 이름을 전달해야 합니다.
- index_col=없음행 인덱스로 사용할 열을 지정합니다. 새 정수 인덱스를 강제로 생성하려면 False를 전달하세요.
- skipinitialspace=False구분자 뒤의 공백을 건너뜁니다.
전체 논거 목록은 공식 자료를 참조하십시오. pandas.read_csv() 문서.
팬더 read_csv() 예
아래 코드 조각은 15개 열의 이름을 모두 지정하고, UCI 파일을 가리키며, 이 특정 데이터 세트에서 모든 쉼표 뒤에 오는 공백을 제거합니다.
## Import csv import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train.shape
출력:
(32561, 15)
해당 형식은 32,561행 15열로 확인되었으므로, COLUMNS에 있는 모든 이름은 파일의 필드와 일치합니다.
Pandas read_csv() 주요 매개변수
read_csv() 함수는 50개 이상의 인수를 받지만, 실제로 필요한 대부분의 함수는 몇 가지 인수로 충분합니다. 아래의 기본값은 현재 pandas API 참조 문서에 나와 있는 내용입니다.
| 매개 변수 | 태만 | 그것이하는 일 |
| 9월 | ',' | 구분자로 사용되는 문자 또는 정규 표현식입니다. 다른 형식을 사용하려면 sep=';' 또는 sep='\t'를 사용하십시오. |
| 머리글 | '미루다' | 열 레이블이 포함된 행 번호입니다. 파일에 헤더 행이 없는 경우 header=None을 전달합니다. |
| 이름 | 설정되지 않은 | 열 레이블의 명시적 목록입니다. header=0과 함께 사용하면 기존 헤더를 대체할 수 있습니다. |
| 인덱스_콜 | 없음 | 행 인덱스로 사용할 열입니다. index_col=False로 설정하면 일반 정수 인덱스가 사용됩니다. |
| 사용열 | 없음 | 레이블 또는 위치를 기준으로 로드할 열의 부분 집합을 선택합니다. 구문 분석 시간과 메모리 사용량을 모두 줄입니다. |
| dtype | 없음 | 열별 데이터 형식을 지정할 수 있습니다(예: {'age': 'int32'}). 형식 추론을 건너뜁니다. |
| na_values | 없음 | 성인 데이터 세트의 '?' 자리 표시자와 같이 NaN으로 읽어야 하는 추가 문자열입니다. |
| 스킵로우/n로우 | 없음 | 앞줄을 건너뛰거나 처음 N개 행의 데이터만 읽습니다. |
| parse_dates | 없음 | 읽을 때 날짜/시간 형식으로 변환할 열과 해당 날짜 형식을 지정합니다. |
| 부호화 | 'utf-8' | 파일의 텍스트 인코딩입니다. 기존 내보내기 기능을 사용하려면 'latin-1' 또는 'cp1252'를 사용하십시오. |
| 청크 크기 | 없음 | N행 단위로 파일을 블록화하여 반환하는 이터레이터를 반환합니다. |
| on_bad_lines | '오류' | 형식이 잘못된 행을 처리하는 방법: 행을 올리거나, 경고하거나, 건너뛰기. |
이 중 두 가지는 특별히 언급할 가치가 있습니다. index_col=False 이는 설정하지 않는 것과는 다릅니다. Pandas에게 첫 번째 열을 승격시키지 않도록 명시적으로 지시하는 것이며, 파일의 모든 줄 끝에 잘못된 구분 기호가 있는 경우에 필요한 동작입니다. names 파일에 명시된 내용을 조용히 덮어쓰기 때문에, 그대로 전달합니다. header=0 CSV 파일에 헤더 행이 실제로 포함되어 있는 경우, 그 옆에 표시됩니다.
Pandas groupby() 메서드
데이터를 쉽게 확인하는 방법 중 하나는 groupby 메서드를 사용하는 것입니다. 이 메서드는 데이터를 그룹별로 요약하는 데 도움이 됩니다. 아래는 groupby() 메서드에서 사용할 수 있는 집계 목록입니다.
- 카운트: 카운트
- 분: 분
- 최대: 최대
- 뜻: 뜻
- 중앙값: 중앙값
- 표준편차: std
- 다른 사람
groupby() 함수 내부에서는 집계를 적용하기 전에 그룹화할 열의 이름을 지정합니다.
단일 그룹을 살펴보겠습니다.ping 성인 데이터셋을 사용하면, 수익 유형(50만 달러 이상 또는 50만 달러 미만)별로 모든 연속 변수의 평균값을 얻을 수 있습니다.
df_train.groupby(['label']).mean()
| 상표 | 나이 | fnlwgt | education_num | 자본 이득 | 자본 손실 | 시간_주 |
| <= 50 | 36.783738 | 190340.86517 | 9.595065 | 148.752468 | 53.142921 | 38.840210 |
| > 50K | 44.249841 | 188005.00000 | 11.611657 | 4006.142456 | 195.001530 | 45.473026 |
가구 유형별 최소 연령을 확인할 수 있습니다.
df_train.groupby(['label'])['age'].min() label <=50K 17 >50K 19 Name: age, dtype: int64
여러 열로 그룹화할 수도 있습니다. 예를 들어, 가구 유형과 결혼 상태에 따라 최대 자본 이득을 얻을 수 있습니다.
df_train.groupby(['label', 'marital'])['capital_gain'].max() label marital <=50K Divorced 34095 Married-AF-spouse 2653 Married-civ-spouse 41310 Married-spouse-absent 6849 Never-married 34095 Separated 7443 Widowed 6849 >50K Divorced 99999 Married-AF-spouse 7298 Married-civ-spouse 99999 Married-spouse-absent 99999 Never-married 99999 Separated 99999 Widowed 99999 Name: capital_gain, dtype: int64
그룹화 후 그래프를 생성할 수 있습니다. 한 가지 방법은 그룹화된 결과를 직접 그래프로 나타내는 것입니다.
보다 명확한 그래프를 만들려면 mean() 함수 다음에 unstack() 함수를 적용하여 혼인 상태를 인덱스에서 열로 이동시키십시오. 그러면 차트는 소득 레이블별로 두 그룹으로 나뉘어 표시되며, 평면 다단계 인덱스 차트에서 생성되는 14개(2*7) 막대 대신 두 개의 그룹으로 표시됩니다.
당신이 Jupyter 수첩`%matplotlib inline`을 추가하는 것을 잊지 마세요. 그렇지 않으면 그래프가 표시되지 않습니다.
%matplotlib inline df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack() df_plot
쌓이지 않은 프레임을 막대 그래프로 나타내면 아래 그림과 같습니다.
Pandas를 사용하여 대용량 CSV 파일을 읽는 방법
성인 데이터셋은 작지만, 수 기가바이트에 달하는 내보내기 작업에서는 동일한 호출이 중단될 수 있습니다. 세 가지 인수가 대부분의 작업을 처리합니다.
- 사용열 실제로 필요한 열만 로드합니다. pandas 문서에 따르면 이로 인해 구문 분석 속도가 훨씬 빨라지고 메모리 사용량이 줄어듭니다.
- dtype 각 열을 특정 유형으로 고정하므로 Pandas는 기본적으로 유형 추론을 건너뛰고 정수를 64비트로 확장하지 않습니다.
- 청크 크기 DataFrame 대신 TextFileReader를 반환하므로 N개 행 블록을 반복하고 진행하면서 집계할 수 있습니다.
import pandas as pd # read only the columns you need, with explicit types cols = ['age', 'education', 'capital_gain', 'label'] types = {'age': 'int32', 'capital_gain': 'int32'} df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types, skipinitialspace=True, index_col=False) # stream the file in fixed-size chunks instead of loading it whole total = 0 for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000, skipinitialspace=True, index_col=False): total = total + len(chunk) print(total)
기본 사항이 갖춰지면 두 가지 추가 옵션이 도움이 될 수 있습니다. engine='pyarrow' 멀티스레드 Arrow 파서로 전환합니다. dtype_backend='pyarrow' 화살표 배경 열에 결과를 유지합니다. low_memory 이 옵션은 기본적으로 True로 설정되어 있어 파일을 내부적으로 조각별로 파싱하지만, 한 열에 여러 유형의 데이터가 혼합될 수 있습니다. 따라서 이 옵션에 의존하기보다는 명시적으로 데이터 유형을 설정하는 것이 좋습니다.
마지막으로, compression='infer' .gz, .zip, .bz2, .xz 또는 .zst로 끝나는 경로는 읽는 즉시 압축이 해제되므로 아카이브를 읽기 전에 압축을 풀 필요가 없습니다.
Pandas의 read_csv() 함수에서 발생하는 일반적인 오류와 해결 방법
read_csv() 오류는 대부분 네 가지 원인에서 발생하며, 각 원인에 대한 해결 방법이 문서화되어 있습니다.
| 오류 | 원인 | 수정 |
| 파일을 찾을 수 없음 오류 | 경로는 스크립트가 아닌 작업 디렉토리를 기준으로 합니다. | 절대 경로를 사용하거나 확인하십시오. URL 스키마는 http, ftp, s3, gs 또는 file 중 하나입니다. |
| 유니코드디코드오류 | 해당 파일은 기본 인코딩인 UTF-8 형식이 아닙니다. | encoding='latin-1' 또는 올바른 코덱을 전달하거나 encoding_errors='replace'를 전달하세요. |
| ParserError: 데이터 토큰화 오류 | 행에는 헤더에 명시된 것보다 더 많은 필드가 포함될 수 있습니다. | on_bad_lines='skip' 또는 'warn'을 전달하거나 올바른 구분 기호를 설정하세요. |
| 데이터 유형 경고: 열에 혼합된 유형이 있습니다. | 청크형 타입 추론은 한 열에 서로 다른 타입이 있는 것으로 인식했습니다. | 명시적인 데이터 유형을 설정하거나 low_memory=False로 설정하십시오. |
| 열이 한 칸씩 이동했습니다. | 끝에 구분자가 있으면 Pandas는 첫 번째 필드를 인덱스로 승격시킵니다. | index_col=False를 전달합니다. |
성인 데이터 세트는 결측값 사례를 직접적으로 보여줍니다. 알 수 없는 직업군, 직업 및 출신 국가 항목은 문자 그대로 물음표로 저장되므로 별도로 선언하지 않으면 '?' 문자열로 나타납니다.
# tolerate rows with too many fields instead of raising df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip') # read a file that is not UTF-8 df = pd.read_csv('sales.csv', encoding='latin-1') # treat the dataset's '?' placeholder as a missing value df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

