Pandas read_csv()에서 Python 예와 함께

⚡ 스마트 요약

Pandas의 `read_csv()` 함수는 로컬 또는 원격의 쉼표로 구분된 파일을 한 번의 호출로 DataFrame으로 변환합니다. 이 예제에서는 UCI 성인 인구 조사 데이터셋을 가져와 15개의 열에 이름을 지정하고, `groupby` 집계를 사용하여 결과를 요약합니다.

  • 🔘 한 번의 전화로: pd.read_csv()는 파일 경로와 문자열을 인수로 받습니다. URL또는 읽기 메서드를 노출하는 모든 객체.
  • ☑️ 열 제어: 열에 레이블을 지정할 이름을 전달하고, index_col=False를 지정하면 일반 정수 인덱스를 유지합니다.
  • ✅ 공백: skipinitialspace=True는 adult 데이터 세트에서 모든 쉼표 뒤에 오는 공백을 제거합니다.
  • 🧪 그룹화 및 집계: groupby() 함수는 프레임의 개수, 최소값, 최대값, 평균, 중앙값 또는 표준편차를 요약합니다.
  • 🛠️ 대용량 파일: usecols, dtype 및 chunksize 옵션을 사용하면 수 기가바이트 크기의 파일을 내보낼 때 구문 분석 시간과 메모리 사용량을 줄일 수 있습니다.
  • ⚠️ 일반적인 오류 : 인코딩 문제, 잘못된 줄, 혼합된 데이터 유형 각각에는 이를 해결하는 데 사용할 수 있는 문서화된 인수가 있습니다.

예제가 포함된 Pandas read_csv()

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)

자주 묻는 질문

두 함수 모두 동일한 파서를 호출합니다. read_csv() 함수는 기본적으로 쉼표로 구분된 파일을 읽는 반면, read_table() 함수는 구분자를 직접 설정해야 합니다. 쉼표로 구분된 파일에는 read_csv() 함수를 사용하고, 탭 또는 파이프로 구분된 파일에는 read_table() 함수를 사용하십시오.

df.to_csv('output.csv', index=False)를 호출합니다. 삭제합니다.ping 인덱스는 다음 읽기 시 이름 없는 첫 번째 열을 방지합니다. 파일을 가져올 때 사용한 설정과 동일하게 하려면 sep, encoding 또는 compression 인수를 추가하세요.

parse_dates 함수에 열 이름 또는 위치를 전달하고, 날짜 형식이 ISO 8601이 아닌 경우 date_format을 추가하세요(예: date_format='%d/%m/%Y'). date_format을 추가하지 않으면 날짜 열이 일반 객체 문자열로 전달되므로 별도의 to_datetime 함수를 호출해야 합니다.

sep 변수에 구분자를 문자로 설정하세요. 예를 들어 sep=';' 또는 sep='\t'와 같이 설정합니다. 구분자가 한 문자보다 길면 정규 표현식으로 처리되어 더 느린 방식이 강제 적용됩니다. Python engine.sep=None은 해당 엔진이 첫 번째 유효한 행에서 구분자를 찾아낼 수 있도록 합니다.

`nrows`를 사용하여 반환할 데이터 행 수를 제한하고, `skiprows`를 사용하여 앞부분의 행들을 건너뛸 수 있습니다. 예를 들어 `skiprows=1000000`과 `nrows=999999`를 조합하면 파일의 두 번째 백만 행을 읽을 수 있습니다.

예. 압축은 기본적으로 '추론' 방식으로 설정되어 있으므로, .gz, .zip, .bz2, .xz 또는 .zst로 끝나는 경로는 자동으로 압축 해제됩니다. URLhttp, ftp, s3, gs 또는 file을 사용하는 모든 방식이 작동하며, storage_options는 자격 증명을 원격 백엔드로 전달합니다.

학습된 모델은 오타 가능성을 표시하고, 유사한 범주 표기를 그룹화하며, 주변 열에서 누락된 값을 대체합니다. 이를 통해 수동 정리 작업은 규칙 기반 na_values ​​또는 dtype 설정만으로는 해결할 수 없는 행으로 좁혀집니다.

Copilot은 파일 샘플을 확인하면 빠르게 기본 코드를 생성합니다. 인자 목록은 임시로 생성된 것이므로, 데이터 유형과 인코딩을 임의로 추측하는 경우가 많습니다. 실행하기 전에 생성된 모든 키워드를 pandas API 참조와 비교하여 확인하십시오.

이 게시물을 요약하면 다음과 같습니다.