Python pandas CSV 파일 읽 기 주의사항(초보 자 에 게 적합)

7536 단어 pandasCSV문건
머리말
본 고 는 pandas 를 사용 하 는 초보 자 에 게 쓰 는 것 으로 주로 흔히 볼 수 있 는 문 제 를 열거 하고 필자 가 밟 은 구덩이 에 따라 귀납 적 으로 정리 하여 독자 에 게 도움 이 되 기 를 바란다.
예제 파일
다음 내용 을 파일 people.csv 로 저장 합 니 다.
d.이름,성별,생년월일,생년월일,직업,취미
1,장소 3,m,1992-10-03,북경,엔지니어,축구
2,이 운 의,m,1995-02-12,상해,프로그래머,독서 바둑
3,주연,여자,1998-03-25,허 페 이,간호사,음악,달리기
4,조영 영,여성,2001-6-32,학생,그림 그리 기
5,정강 강,남,1991-03-05,남경(nanjing),변호사,역사-정치
모든 것 이 정상 이 라면 Jupyter Notebook 에 다음 과 같은 내용 을 표시 해 야 합 니 다.

파일 인 코딩
파일 인 코딩 형식 은 가장 실수 하기 쉬 운 문제 중의 하나 이다.인 코딩 형식 이 정확 하지 않 으 면 파일 내용 을 전혀 읽 지 못 하고 다음 과 같은 오류 가 발생 하여 전혀 당황 합 니 다.
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
in
----> 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-8 과 gb 2312 두 가지 형식 으로 정확 한 인 코딩 만 지정 해 야 합 니 다.인 코딩 을 모 르 는 상태 에서 두 번 만 시도 하면 된다.padas 기본 파일 인 코딩 형식 은 utf-8 입 니 다.따라서 상기 오류 가 발생 하면 encoding=gb 2312 를 사용 하여 다시 시도 하면 됩 니 다.예 를 들 어 pd.readcsv(file, encoding='gb2312')。
빈 값
빈 값 은 csv 에서 도 흔히 볼 수 있 습 니 다.예 를 들 어 다음 과 같은 내용 입 니 다.

import pandas as pd
df = pd.read_csv('people.csv')
v1=df['   '][3]
print(v1, type(v1))
출력:
nan
이 를 통 해 알 수 있 듯 이 빈 값 도 데이터 형식 이 있 고 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



날짜 오류
생년월일 중 일부 데이터 오류,예 를 들 어 조영 영 의 생년월일 은 6 월 32 일이 라 잘못 보고 했다.이러한 유사 한 오류 에 대해 우 리 는 함수 판단 방식 으로 처리 할 수 있 으 며,구체 적 으로 는 다음 과 같다.
우선,isDate 함 수 를 작성 하여 날짜 가 합 법 적 인지 판단 하 는 데 사용 합 니 다.

def isDate(adate):
    try:
        sects = adate.split('-')
        year = int(sects[0])
        month = int(sects[1])
        day = int(sects[2])
        days = [0, 31, 29 if year % 4 == 0 else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        return year > 0 and year < 9999 and month > 0 and month <= 12 and day > 0 and day <= days[month]
    except:
        return False
그리고 다음 코드 를 사용 하여 판단 합 니 다.

for id in df.index:
    if not isDate(df.loc[id, '    ']):
        print(df.loc[id, '    '])
        df.loc[id, '    '] = '2000-01-01'
출력 결 과 는 다음 과 같 습 니 다.잘못된 날짜 가 2020 년 1 월 1 일 로 수정 되 었 음 을 알 수 있 습 니 다.
2001-6-32
   id   성명.      성별.        생년월일          출생지   직업.     애호 
0   1  장 소 삼       m  1992-10-03           중국 북경  기사.     축구공  
1   2  이 운 의       m  1995-02-12           과 상해  프로그래머  책 을 읽 고 장 기 를 두다.  
2   3   주연       여자.  1998-03-25           허 페 이   간호원  음악,달리기  
3   4  조영 영  Female  2000-01-01          NaN   학생.     그림 을 그리다   
4   5  정강 강       남자.  1991-03-05  난 징(난 징)   변호사.  역사-정치  
함수 매 핑
방법 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 파일 을 읽 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 을 바 랍 니 다!

좋은 웹페이지 즐겨찾기