上面一篇文章有記錄pandas構造數據框的方式有二維數組,字典,嵌套的列表和元組等,本篇用於介紹通過外部數據讀取的方式來構造數據框。
python讀取外部數據集的時候,這些數據集可能包含在文本文件(csv,txt),電子表格Excel和數據庫中(Mysql,SQL server)等,那么如何來用pandas來實現這些
文件,表格和數據庫的讀取呢?
1.文本文件的讀取
read_table函數介紹
函數原型:
pd.read_table(filepath_or_buffer,sep='t',header='infer',names=None,index_col=None,usecols=None,dtype=None,converters=None,skiprows=None,
skipfooter=None,nrows=None,na_values=None,skip_blank_lines=True,parse_dates=False,thousands=None,comment=None,encoding=None)
各參數的含義:
file_path_or_buffer:指定txt或csv文件所在的具體路徑
sep:指定數據集中各字段之間的分隔符,默認為Tab制表符
header:是否需要將原數據集中的第一行作為表頭,默認將第一行用作字段名稱
names:如果原數據集中沒有字段,可以通過該參數在數據讀取時給數據框添加具體的表頭
index_col:指定原數據集中的某些列作為數據框的行索引(標簽)
usecols:指定需要讀取原數據集中的哪些變量名;
dtype:讀取數據時,可以為原數據的每個字段設置不同的數據類型
converters:通過字典格式,為數據集中的某些字段設置轉換函數
skiprows:數據讀取時,指定需要跳過原數據集開頭的行數
skipfooter:數據讀取時,指定需要跳過原數據集末尾的行數
nrows:指定讀取的數據的行數
na_values:指定原數據集中哪些特征的值作為缺失值
skip_blank_lines:讀取數據時是否需要跳過原數據集中的空白行,默認為True
parse_dates:如果參數值為True,則嘗試解析數據框的行索引;如果參數為列表,則嘗試解析對應的日期列;如果參數為嵌套列表,則將某些列合並為日期列;
如果參數為字典,則解析對應的列(字典中的值),並生成新的字段名(字典中的鍵)。
thousands:指定原始數據集中的千分位符
comment:指定注釋符,在讀取數據時,如果碰到行首指定的注釋符,則跳過改行
encoding:如果文件中含有中文,有時需要指定字符編碼。
涉及的參數比較多,用的時候有些參數是用不上的,根據需要設置,如下示例:
有txt文件,內容如下:
'''
數據來源:某公司人事記錄表
時間范圍:2019.1.1~2019.10.31
year,month,day,gender,occupation,income
1990,3,7,男,銷售經理,6&000
1989,8,10,女,化妝師,8$500
# 1991,10,10,男,后端開發,13&500
1992,10,7,女,前端設計,6&500
1985,6,15,男,數據分析師,18&000
該數據集僅用於參考!
不可以用於他用!
備注於2019年11月。
'''
處理數據之前,先觀察數據有以下特點,思考如何解決:
1.數據集並不是從第一行開始的,前面幾行實際上是數據集的來源說明,讀取數據時需要注意什么問題。
2.數據的末尾3行仍然不是需要讀入的數據,如何避免后3行數據的讀入。
3.中間部分的數據,第四行前加了#號,表示不需要讀取改行數據,改如何處理
4.數據集中的收入一行,千分位符是&,如何將該字段讀入為正常的數值型數據
5.如果需要將year,month和day三個字段解析為新的birthday字段,該如何做到。
6.數據集中含有中文,一般在讀取含中文的文本文件是都會出現編碼錯誤,該如何解決。
import pandas as pd
test_Data = pd.read_table(r'D:\data_test01.txt',sep=',',header='infer',
skiprows=2,skipfooter=3,parse_dates={'birthday':[0,1,2]},
comment='#',encoding='utf-8',thousands='&',engine='python')
test_Data
out:
這里補充說明一下utf-8編碼的問題:encoding應該是用utf-8的,沒有錯誤;但是我開始的時候怎么搞都是說utf-8的編碼問題,我查閱了很多方法都不行;后面參考了一些人的經驗改成,
encoding = 'ISO-8859-1',於是顯示成了如下亂碼的樣子,至少沒有報錯了。花了我不少時間去研究都沒有找到處理方式(文件內容我也改成UTF-8的編碼了);
然后參考了一本相關的書,提示到,我們處理txt文件的時候,只在txt里面更改編碼方式加上設置encoding=utf-8 是沒有效果的,要把文件另存為,UTF-8編碼格式的,然后替換原文件,如下:
然后再次運行,就得出了正常的結果;也算是一個處理中文編碼問題的經驗吧。