使用Python pandas讀取CSV文件應(yīng)該注意什么?
示例文件
將以下內(nèi)容保存為文件 people.csv
。
id,姓名,性別,出生日期,出生地,職業(yè),愛好 1,張小三,m,1992-10-03,北京,工程師,足球 2,李云義,m,1995-02-12,上海,程序員,讀書 下棋 3,周娟,女,1998-03-25,合肥,護(hù)士,音樂,跑步 4,趙盈盈,Female,2001-6-32,,學(xué)生,畫畫 5,鄭強(qiáng)強(qiáng),男,1991-03-05,南京(nanjing),律師,歷史-政治
如果一切正常的話,在Jupyter Notebook 中應(yīng)該顯示以下內(nèi)容:
文件編碼
文件編碼格式是最容易出錯的問題之一。如果編碼格式不正確,就會完全讀取不出文件內(nèi)容,出現(xiàn)類似于以下的錯誤, 讓人完全不知所措:
--------------------------------------------------------------------------- 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-8
和 gb2312
兩種格式,只需要指定正確的編碼。在不知道編碼的情況下,只需要嘗試兩次即可。padas默認(rèn)的文件編碼格式是 utf-8
,所以如果出現(xiàn)以上錯誤,只需使用 encoding=gb2312
再嘗試一下即可,如 pd.read_csv(file, encoding='gb2312')
。
空值
空值是csv中也非常常見,比如以下內(nèi)容:
import pandas as pd df = pd.read_csv('people.csv') v1=df['出生地'][3] print(v1, type(v1))
輸出為:
nan <class 'float'>
由此可見,空值也是有數(shù)據(jù)類型的,為 float
類型。
如何判斷空值有兩種方法,可以使用 math.isnan(x)
也可以使用 isinstance(float)
。我們知道,DateFrame對象是包括Series對象,而在一個Series對象中,所有的數(shù)據(jù)類型默認(rèn)是一樣的,所以如果其數(shù)據(jù)類型推斷為字符串(str),那么直接使用 math.isnan(x) 則會報錯 TypeError: must be real number, not str
錯誤,即必需為實數(shù),不能是字符串。所以,這時我們還需要使用 isinstance(x, flaot)
方法。
具體請看這個示例:
df.出生地=df.出生地.map(lambda x: '其他' if isinstance(x, float) else x) df
函數(shù)映射
方法1:直接使用labmda表達(dá)式
需要對數(shù)據(jù)列進(jìn)行復(fù)雜操作的時候,我們可以使用以下函數(shù)時行相應(yīng)的操作。
df=df.fillna('未知') df.愛好=df.愛好.map(lambda x: x.split(' ')[0].split('-')[0].split(',')[0]) df
方法二:使用自定義函數(shù)
在進(jìn)行映射時,如果操作比較簡單,可以使用字典的方式進(jìn)行數(shù)值映射映射(參見下文)。但是如果操作比較復(fù)雜,則需要使用函數(shù)進(jìn)行映射。請看這個示例,讀取到性別時,內(nèi)容有 ‘m', ‘M', ‘Female' 等內(nèi)容,現(xiàn)在需要其全部轉(zhuǎn)換為 男
或 女
:
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
方法三:使用數(shù)值字典映射
在數(shù)據(jù)處理時,數(shù)值型往往比字符串效率更高,所以在可能的情況下,我們希望將數(shù)據(jù)轉(zhuǎn)換成字符串處理。請看這個示例,將輸入的數(shù)據(jù)的性別中的男性轉(zhuǎn)換為1 女性轉(zhuǎn)換為0。操作如下:
到此這篇關(guān)于使用Python pandas讀取CSV文件應(yīng)該注意什么?的文章就介紹到這了,更多相關(guān)pandas讀取CSV文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python爬蟲headers設(shè)置后無效的解決方法
這篇文章主要為大家詳細(xì)介紹了python爬蟲headers設(shè)置后無效的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10用python實現(xiàn)簡單EXCEL數(shù)據(jù)統(tǒng)計的實例
下面小編就為大家?guī)硪黄胮ython實現(xiàn)簡單EXCEL數(shù)據(jù)統(tǒng)計的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01