Python pandas 를 사용 하여 CSV 파일 을 읽 으 려 면 무엇 을 주의해 야 합 니까?

예제 파일
다음 내용 을 파일people.csv로 저장 합 니 다.

id,  ,  ,    ,   ,  ,  
1,   ,m,1992-10-03,  ,   ,  
2,   ,m,1995-02-12,  ,   ,     
3,  , ,1998-03-25,  ,  ,  ,  
4,   ,Female,2001-6-32,,  ,  
5,   , ,1991-03-05,  (nanjing),  ,  -  
모든 것 이 정상 이 라면 Jupyter Notebook 에 다음 과 같은 내용 을 표시 해 야 합 니 다.
在这里插入图片描述
파일 인 코딩
파일 인 코딩 형식 은 가장 실수 하기 쉬 운 문제 중의 하나 이다.인 코딩 형식 이 정확 하지 않 으 면 파일 내용 을 전혀 읽 지 못 하고 다음 과 같은 오류 가 발생 하여 전혀 당황 합 니 다.

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-6-8659adefcfa6> in <module>
----> 1 pd.read_csv('people.csv', encoding='gb2312')

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
    683         )
    684 
--> 685         return _read(filepath_or_buffer, kwds)
    686 
    687     parser_f.__name__ = name

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    455 
    456     # Create the parser.
--> 457     parser = TextFileReader(fp_or_buf, **kwds)
    458 
    459     if chunksize or iterator:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
    893             self.options["has_index_names"] = kwds["has_index_names"]
    894 
--> 895         self._make_engine(self.engine)
    896 
    897     def close(self):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
   1133     def _make_engine(self, engine="c"):
   1134         if engine == "c":
-> 1135             self._engine = CParserWrapper(self.f, **self.options)
   1136         else:
   1137             if engine == "python":

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
   1915         kwds["usecols"] = self.usecols
   1916 
-> 1917         self._reader = parsers.TextReader(src, **kwds)
   1918         self.unnamed_cols = self._reader.unnamed_cols
   1919 

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._get_header()

UnicodeDecodeError: 'gb2312' codec can't decode byte 0x93 in position 2: illegal multibyte sequence
현재 중국어 에서 가장 많이 사용 되 는 것 은utf-8gb2312두 가지 형식 으로 정확 한 인 코딩 만 지정 하면 됩 니 다.인 코딩 을 모 르 는 상태 에서 두 번 만 시도 하면 된다.padas 의 기본 파일 인 코딩 형식 은utf-8입 니 다.따라서 이 오류 가 발생 하면encoding=gb2312를 사용 하여 다시 시도 하면 됩 니 다.예 를 들 어pd.read_csv(file, encoding='gb2312').
빈 값
빈 값 은 csv 에서 도 흔히 볼 수 있 습 니 다.예 를 들 어 다음 과 같은 내용 입 니 다.

import pandas as pd
df = pd.read_csv('people.csv')
v1=df['   '][3]
print(v1, type(v1))
출력:

nan <class 'float'>
이 를 통 해 알 수 있 듯 이 빈 값 도 데이터 형식 이 있 고float형식 입 니 다.
빈 값 을 어떻게 판단 하 는 지 는 두 가지 방법 이 있 습 니 다.math.isnan(x)를 사용 할 수도 있 고isinstance(float)를 사용 할 수도 있 습 니 다.DateFrame 대상 은 Series 대상 을 포함 하고 하나의 Series 대상 에서 모든 데이터 형식 은 기본적으로 같 기 때문에 데이터 형식 이 문자열(str)로 추정 된다 면 math.isnan(x)을 직접 사용 하면 오류TypeError: must be real number, not str오류 가 발생 합 니 다.즉,실수 로 문자열 이 아 닙 니 다.그래서 이 럴 때 우 리 는isinstance(x, flaot)방법 을 사용 해 야 한다.
구체 적 으로 이 예 시 를 보십시오.

df.   =df.   .map(lambda x: '  ' if isinstance(x, float) else x)
df
在这里插入图片描述
함수 매 핑
방법 1:labmda 표현 식 직접 사용
데이터 열 을 복잡 하 게 조작 해 야 할 때 우 리 는 아래 함 수 를 사용 할 때 해당 하 는 조작 을 할 수 있다.

df=df.fillna('  ')
df.  =df.  .map(lambda x: x.split(' ')[0].split('-')[0].split(',')[0])
df
在这里插入图片描述
방법 2:사용자 정의 함수 사용
맵 을 진행 할 때 조작 이 간단 하면 사전 방식 으로 수치 맵 을 진행 할 수 있 습 니 다(아래 참조).그러나 조작 이 복잡 하 다 면 함수 로 매 핑 을 해 야 한다.이 예제 를 보십시오.성별 을 읽 을 때 내용 은'm','M','Female'등 이 있 습 니 다.지금 은 모두 또는 로 전환 해 야 합 니 다.

def set_sex(s):
    if s.lower() == 'm' or s.lower() == 'male':
        return ' '
    elif s.lower() == 'female':
        return ' '        
    return s

df = pd.read_csv('people.csv', converters={'  ': lambda x : set_sex(x)})
df
在这里插入图片描述
방법 3:수치 사전 맵 사용
데이터 처리 시 문자열 보다 수치 형 이 효율 적 이기 때문에 가능 한 한 데 이 터 를 문자열 로 변환 하고 싶 습 니 다.입력 한 데이터 의 성별 중 남성 을 1 여성 으로 0 으로 바 꾸 는 예 시 를 보십시오.동작 은 다음 과 같 습 니 다.
在这里插入图片描述
Python pandas 를 사용 하여 CSV 파일 을 읽 을 때 무엇 을 주의해 야 합 니까?이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 pandas 가 CSV 파일 내용 을 읽 고 있 습 니 다.예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기