您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python的pandas讀取CSV文件需要注意什么”,在日常操作中,相信很多人在Python的pandas讀取CSV文件需要注意什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python的pandas讀取CSV文件需要注意什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
前言
示例文件
文件編碼
空值
日期錯(cuò)誤
函數(shù)映射
方法1:直接使用labmda表達(dá)式
方法二:使用自定義函數(shù)
方法三:使用數(shù)值字典映射
本文是給使用pandas的新手而寫,主要列出一些常見的問題,根據(jù)筆者所踩過的坑,進(jìn)行歸納總結(jié),希望對(duì)讀者有所幫助。
將以下內(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)容:
文件編碼格式是最容易出錯(cuò)的問題之一。如果編碼格式不正確,就會(huì)完全讀取不出文件內(nèi)容,出現(xiàn)類似于以下的錯(cuò)誤, 讓人完全不知所措:
---------------------------------------------------------------------------
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__ = nameC:\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
1919pandas\_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
目前對(duì)于中文而言,最常使用的有 utf-8 和 gb2312 兩種格式,只需要指定正確的編碼。在不知道編碼的情況下,只需要嘗試兩次即可。padas默認(rèn)的文件編碼格式是 utf-8,所以如果出現(xiàn)以上錯(cuò)誤,只需使用 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對(duì)象是包括Series對(duì)象,而在一個(gè)Series對(duì)象中,所有的數(shù)據(jù)類型默認(rèn)是一樣的,所以如果其數(shù)據(jù)類型推斷為字符串(str),那么直接使用 math.isnan(x) 則會(huì)報(bào)錯(cuò) TypeError: must be real number, not str 錯(cuò)誤,即必需為實(shí)數(shù),不能是字符串。所以,這時(shí)我們還需要使用 isinstance(x, flaot) 方法。
具體請(qǐng)看這個(gè)示例:
df.出生地=df.出生地.map(lambda x: '其他' if isinstance(x, float) else x) df
出生日期中,有的數(shù)據(jù)錯(cuò)誤,如趙盈盈的出生日期是6月32號(hào),所以報(bào)錯(cuò)了。對(duì)于這樣類似的錯(cuò)誤,我們可以使用函數(shù)判斷的方式進(jìn)行處理,具體如下。
首先,編寫 isDate 函數(shù)用于判斷日期是否合法。
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
然后使用以下代碼進(jìn)行判斷:
for id in df.index: if not isDate(df.loc[id, '出生日期']): print(df.loc[id, '出生日期']) df.loc[id, '出生日期'] = '2000-01-01'
輸出結(jié)果如下,可見錯(cuò)誤的日期被修改成了2020年1月1日。
2001-6-32
id 姓名 性別 出生日期 出生地 職業(yè) 愛好
0 1 張小三 m 1992-10-03 北京 工程師 足球
1 2 李云義 m 1995-02-12 上海 程序員 讀書 下棋
2 3 周娟 女 1998-03-25 合肥 護(hù)士 音樂,跑步
3 4 趙盈盈 Female 2000-01-01 NaN 學(xué)生 畫畫
4 5 鄭強(qiáng)強(qiáng) 男 1991-03-05 南京(nanjing) 律師 歷史-政治
需要對(duì)數(shù)據(jù)列進(jìn)行復(fù)雜操作的時(shí)候,我們可以使用以下函數(shù)時(shí)行相應(yīng)的操作。
df=df.fillna('未知') df.愛好=df.愛好.map(lambda x: x.split(' ')[0].split('-')[0].split(',')[0]) df
在進(jìn)行映射時(shí),如果操作比較簡(jiǎn)單,可以使用字典的方式進(jìn)行數(shù)值映射映射(參見下文)。但是如果操作比較復(fù)雜,則需要使用函數(shù)進(jìn)行映射。請(qǐng)看這個(gè)示例,讀取到性別時(shí),內(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ù)據(jù)處理時(shí),數(shù)值型往往比字符串效率更高,所以在可能的情況下,我們希望將數(shù)據(jù)轉(zhuǎn)換成字符串處理。請(qǐng)看這個(gè)示例,將輸入的數(shù)據(jù)的性別中的男性轉(zhuǎn)換為1 女性轉(zhuǎn)換為0。操作如下:
到此,關(guān)于“Python的pandas讀取CSV文件需要注意什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。