오류와 결측치 처리

pandas로 빠르고 간편한 데이터 적재

Amany Mahfouz

Instructor

평문 파일 가져오기의 일반 문제

  • 열 데이터 타입이 잘못됨
  • 값이 누락됨
  • pandas가 읽지 못하는 레코드
pandas로 빠르고 간편한 데이터 적재

데이터 타입 지정

  • pandas는 열 데이터 타입을 자동 추론합니다
print(tax_data.dtypes)
STATEFIPS      int64
STATE         object
zipcode        int64
agi_stub       int64
N1             int64
               ...
N11902         int64
A11902         int64
Length: 147, dtype: object
pandas로 빠르고 간편한 데이터 적재

데이터 타입 지정

  • dtype 매개변수로 열의 데이터 타입을 지정합니다
  • dtype는 열 이름과 타입의 딕셔너리를 받습니다
tax_data = pd.read_csv("us_tax_data_2016.csv", dtype={"zipcode": str})

print(tax_data.dtypes)
STATEFIPS      int64
STATE         object
zipcode       object
agi_stub       int64
N1             int64
               ...
N11902         int64
A11902         int64
Length: 147, dtype: object
pandas로 빠르고 간편한 데이터 적재

결측치 값 사용자 지정

  • pandas는 일부 값을 결측치(NA)로 자동 해석합니다
print(tax_data.head())
   STATEFIPS STATE  zipcode  agi_stub      N1   ...  A85300  N11901  A11901  N11902   A11902
0          1    AL        0         1  815440   ...       0   63420   51444  711580  1831661
1          1    AL        0         2  495830   ...       0   74090  110889  416090  1173463
2          1    AL        0         3  263390   ...       0   64000  143060  195130   543284
3          1    AL        0         4  167190   ...       0   45020  128920  117410   381329
4          1    AL        0         5  217440   ...      19   82940  423629  126130   506526

[5 rows x 147 columns]
pandas로 빠르고 간편한 데이터 적재

결측치 값 사용자 지정

  • na_values 매개변수로 사용자 지정 결측값을 설정합니다
  • 단일 값, 리스트, 또는 열별 딕셔너리를 전달할 수 있습니다
tax_data = pd.read_csv("us_tax_data_2016.csv", 
                       na_values={"zipcode" : 0})

print(tax_data[tax_data.zipcode.isna()])
        STATEFIPS STATE  zipcode  agi_stub       N1   ...      A85300  N11901    A11901   N11902   A11902
0               1    AL      NaN         1   815440   ...           0   63420     51444   711580  1831661
1               1    AL      NaN         2   495830   ...           0   74090    110889   416090  1173463
2               1    AL      NaN         3   263390   ...           0   64000    143060   195130   543284
...           ...   ...      ...       ...      ...   ...         ...     ...       ...      ...      ...
179034         56    WY      NaN         5    38030   ...         121   13230     73326    22250    99589
179035         56    WY      NaN         6     8480   ...       53835    3630    128149     2250   125557

[306 rows x 147 columns]
pandas로 빠르고 간편한 데이터 적재

오류가 있는 행

us_tax_data_2016_corrupt.csv 예시

STATEFIPS,STATE,zipcode,agi_stub,...,N11901,A11901,N11902,A11902
1,AL,0,1,...,63420,51444,711580,1831661
1,AL,0, ,2,...,74090,110889,416090,1173463
tax_data = pd.read_csv("us_tax_data_2016_corrupt.csv")
pandas로 빠르고 간편한 데이터 적재
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
    data = pd.read_csv('us_tax_data_2016_corrupt.csv')
  File "<stdin>", line 697, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "<stdin>", line 430, in _read
    data = parser.read(nrows)
  File "<stdin>", line 1134, in read
    ret = self._engine.read(nrows)
  File "<stdin>", line 1990, in read
    data = self._reader.read(nrows)
  File "<stdin>", line 899, in pandas._libs.parsers.TextReader.read
  File "<stdin>", line 914, in pandas._libs.parsers.TextReader._read_low_memory
  File "<stdin>", line 968, in pandas._libs.parsers.TextReader._read_rows
  File "<stdin>", line 955, in pandas._libs.parsers.TextReader._tokenize_rows
  File "<stdin>", line 2172, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 147 fields in line 3, saw 148
pandas로 빠르고 간편한 데이터 적재

오류가 있는 행

  • 파싱 불가 레코드는 error_bad_lines=False로 건너뜁니다
  • 건너뛴 레코드 경고는 warn_bad_lines=True로 표시합니다
tax_data = pd.read_csv("us_tax_data_2016_corrupt.csv",
                       error_bad_lines=False,
                       warn_bad_lines=True)
b'Skipping line 3: expected 147 fields, saw 148\n'
pandas로 빠르고 간편한 데이터 적재

Ayo berlatih!

pandas로 빠르고 간편한 데이터 적재

Preparing Video For Download...