當使用 Pandas 做數據分析的時,需要讀取事先準備好的數據集,這是做數據分析的第一步。Panda 提供了多種讀取數據的方法,針對不同的文件格式,有以下幾種:
(1) read_csv() 用于讀取文本文件。
(2) read_excel() 用于讀取文本文件。
(3) read_json() 用于讀取 json 文件。
(4) read_sql_query() 讀取 sql 語句的。
其通用的流程如下:
(1) 導入庫 import pandas as pd。
(2) 找到文件所在位置(絕對路徑 = 全稱)(相對路徑 = 和程序在同一個文件夾中的路徑的簡稱)。
(3) 變量名 = pd.讀寫操作方法(文件路徑,具體的篩選條件,……)。
CSV 又稱逗號分隔值文件,是一種簡單的文件格式,以特定的結構來排列表格數據。 CSV 文件能夠以純文本形式存儲表格數據,比如電子表格、數據庫文件,并具有數據交換的通用格式。CSV 文件會在 Excel 文件中被打開,其行和列都定義了標準的數據格式。
將 CSV 中的數據轉換為 DataFrame 對象是非常便捷的。和一般文件讀寫不一樣,它不需要你做打開文件、讀取文件、關閉文件等操作。相反,您只需要一行代碼就可以完成上述所有步驟,并將數據存儲在 DataFrame 中。
下面進行實例演示,源數據如下:
首先,我們對 CSV 文件進行讀取,可以通過相對路徑,也可以通過 os 動態取得絕對路徑 os.getcwd() os.path.json。
importpandasaspddf=pd.read_csv("./data/my_csv.csv")print(df,type(df))#col1col2col3col4col5#02a1.4apple2022/1/1#13b3.4banana2022/1/2#26c2.5orange2022/1/5#35d3.2grape2022/1/7<class'pandas.core.frame.DataFrame'>
我們可以通過 os.getcwd() 讀取文件的存儲路徑。
importosos.getcwd()#'C:\\Users\\CQB\\Desktop\\內蒙農業大學數據分析教案和代碼\\第16天'
其語法模板如下:
read_csv(filepath_or_buffer,sep=',',header='infer',names=None,index_col=None,usecols=None,squeeze=None,prefix=None,mangle_dupe_cols=True,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skipinitialspace=False,skiprows=None,skipfooter=0,nrows=None,na_values=None,keep_default_na=True,na_filter=True,verbose=False,skip_blank_lines=True,parse_dates=None,infer_datetime_format=False,keep_date_col=False,date_parser=None,dayfirst=False,cache_dates=True,iterator=False,chunksize=None,compression='infer',thousands=None,decimal='.',lineterminator=None,quotechar='"',quoting=0,doublequote=True,escapechar=None,comment=None,encoding=None,encoding_errors='strict',dialect=None,error_bad_lines=None,warn_bad_lines=None,on_bad_lines=None,delim_whitespace=False,low_memory=True,memory_map=False,float_precision=None,storage_options=None)
(1) filepath_or_buffer(數據輸入的路徑):可以是文件路徑、可以是 URL,也可以是實現 read 方法的任意對象。這個參數,就是我們輸入的第一個參數。
我們可以直接 read_csv 讀取我們想要的文件。
importpandasaspdpd.read_csv(r"data\students.csv")#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
還可以是一個 URL,如果訪問該 URL 會返回一個文件的話,那么 pandas 的 read_csv函 數會自動將該文件進行讀取。比如:我們服務器上放的數據,將剛才的文件返回。
但需要注意的是,他需要網絡請求,因此讀取文件比較慢。
pd.read_csv("http://my-teaching.top/static/data/students.csv")
里面還可以是一個 _io.TextIOWrapper,其中,pandas 默認使用 utf-8 讀取文件,比如:
f=open(r"data\students.csv",encoding="utf-8")pd.read_csv(f)#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
(2) sep:讀取 csv 文件時指定的分隔符,默認為逗號。注意:csv 文件的分隔符和我們讀取 csv 文件時指定的分隔符一定要一致。
importpandasaspdpd.read_csv(r"data\students_step.csv")#id|name|address|gender|birthday#01|朱夢雪|地球村|女|2004/11/2#12|許文博|月亮星|女|2003/8/7#23|張兆媛|艾爾星|女|2004/11/2#34|付延旭|克哈星|男|2003/10/11#45|王杰|查爾星|男|2002/6/12#56|董澤宇|塔桑尼斯|男|2002/2/12
由于指定的分隔符和 csv 文件采用的分隔符不一致,因此多個列之間沒有分開,而是連在一起了。 所以,我們需要將分隔符設置成 \t 才可以。
df=pd.read_csv(r"data\students_step.csv",sep="|")df#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
(3) delim_whitespace:默認為 False,設置為 True 時,表示分割符為空白字符,可以是空格、\t 等等。不管分隔符是什么,只要是空白字符,那么可以通過 delim_whitespace=True 進行讀取。如下,我們對 delim_whitespace 不設置,也就是默認為 False,會發現讀取有點問題。
df=pd.read_csv(r"data\students_whitespace.txt",sep="")df#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博\t月亮星女2003/8/7NaN#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰\t查爾星男2002/6/12NaN#56董澤宇\t塔桑尼斯男2002/2/12NaN
對此,我們將 delim_whitespace 設置為 True,便會得到我們想要的讀取結果。
df=pd.read_csv(r"data\students_whitespace.txt",delim_whitespace=True)df#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
(4) header:用作列名的行號,以及數據的開頭。
默認行為是推斷列名:如果沒有傳遞任何名稱,則該行為與 header=0 相同,并且從文件的第一行推斷列名,如果顯式傳遞列名,則該行為與 header=None 相同。
顯式傳遞 header=0 以替換現有名稱。標題可以是整數列表,指定列上多索引的行位置,例如 [0,1,3]。未指定的中間行將被跳過(例如,本例中跳過 2 行)。
這里需要注意,如果 skip_blank_lines=True,此參數將忽略注釋行和空行,因此 header=0 表示數據的第一行,而不是文件的第一行。
(5) names:當 names 沒被賦值時,header 會變成 0,即選取數據文件的第一行作為列名;當 names 被賦值,header 沒被賦值時,那么 header 會變成 None。如果都賦值,就會實現兩個參數的組合功能。
(a) names 沒有被賦值,header 也沒賦值:
這種情況下,header 為 0,即選取文件的第一行作為表頭。
pd.read_csv(r"data\students.csv")#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
(b) names 沒有被賦值,header 被賦值:
如果不指定 names,指定 header 為 1,則選取第二行當做表頭,第二行下面為數據。
pd.read_csv(r"data\students.csv",header=1)#1朱夢雪地球村女2004/11/2#02許文博月亮星女2003/8/7#13張兆媛艾爾星女2004/11/2#24付延旭克哈星男2003/10/11#35王杰查爾星男2002/6/12#46董澤宇塔桑尼斯男2002/2/12
(c) names 被賦值,header 沒有被賦值:
pd.read_csv(r"data\students.csv",names=["編號","姓名","地址","性別","出生日期"])#編號姓名地址性別出生日期#0idnameaddressgenderbirthday#11朱夢雪地球村女2004/11/2#22許文博月亮星女2003/8/7#33張兆媛艾爾星女2004/11/2#44付延旭克哈星男2003/10/11#55王杰查爾星男2002/6/12#66董澤宇塔桑尼斯男2002/2/12
可以看到,names 適用于沒有表頭的情況,指定 names 沒有指定 header,那么 header 相當于 None。
一般來說,讀取文件的時候會有一個表頭,一般默認是第一行,但是有的文件中是沒有表頭的,那么這個時候就可以通過 names 手動指定、或者生成表頭,而文件里面的數據則全部是內容。
所以這里 id、name、address、date 也當成是一條記錄了,本來它是表頭的,但是我們指定了 names,所以它就變成數據了,表頭是我們在 names 里面指定的。
(a) names 和 header 都被賦值:
pd.read_csv(r"data\students.csv",names=["編號","姓名","地址","性別","出生日期"],header=1)#編號姓名地址性別出生日期#02許文博月亮星女2003/8/7#13張兆媛艾爾星女2004/11/2#24付延旭克哈星男2003/10/11#35王杰查爾星男2002/6/12#46董澤宇塔桑尼斯男2002/2/12
這個時候,相當于先不看 names,只看 header,header 為 0 代表先把第一行當做表頭,下面的當成數據;然后再把表頭用 names 給替換掉。
names 和 header 的使用場景主要如下:
(1) csv 文件有表頭并且是第一行,那么 names 和 header 都無需指定;
(2) csv 文件有表頭、但表頭不是第一行,可能從下面幾行開始才是真正的表頭和數據,這個時候指定 header 即可;
(3) csv 文件沒有表頭,全部是純數據,那么我們可以通過 names 手動生成表頭;
(4) csv 文件有表頭、但是這個表頭你不想用,這個時候同時指定 names 和 header。先用 header 選出表頭和數據,然后再用 names 將表頭替換掉,就等價于將數據讀取進來之后再對列名進行 rename。
(6) index_col:我們在讀取文件之后所得到的 DataFrame 的索引默認是 0、1、2……,我們可以通過 set_index 設定索引,但是也可以在讀取的時候就指定某列為索引。
df=pd.read_csv(r"data\students.csv",index_col="birthday")df#idnameaddressgender#birthday#2004/11/21朱夢雪地球村女#2003/8/72許文博月亮星女#2004/11/23張兆媛艾爾星女#2003/10/114付延旭克哈星男#2002/6/125王杰查爾星男#2002/2/126董澤宇塔桑尼斯男
也可以用來刪除指定列。
df.index=df['birthday']deldf['birthday']df#idnameaddressgender#birthday#2004/11/21朱夢雪地球村女#2003/8/72許文博月亮星女#2004/11/23張兆媛艾爾星女#2003/10/114付延旭克哈星男#2002/6/125王杰查爾星男#2002/2/126董澤宇塔桑尼斯男
我們在讀取的時候指定了 name 列作為索引; 此外,除了指定單個列,還可以指定多列作為索引,比如 [“id”, “name”]。同時,我們除了可以輸入列名外,還可以輸入列對應的索引。比如:“id”、“name”、“address”、"date"對應的索引就分別是 0、1、2、3。
df2=pd.read_csv(r"data\students.csv",index_col=["gender","birthday"])df2#idnameaddress#genderbirthday#女2004/11/21朱夢雪地球村#2003/8/72許文博月亮星#2004/11/23張兆媛艾爾星#男2003/10/114付延旭克哈星#2002/6/125王杰查爾星#2002/2/126董澤宇塔桑尼斯
使用 loc 刪選也是同樣的道理。
df2.loc["女"]#idnameaddress#birthday#2004/11/21朱夢雪地球村#2003/8/72許文博月亮星#2004/11/23張兆媛艾爾星
(7) usecols:返回列的子集。
如果是類似列表的,則所有元素都必須是位置性的(即文檔列中的整數索引),或者是與用戶在名稱中提供的列名或從文檔標題行推斷的列名相對應的字符串。如果給出了名稱,則不考慮文檔標題行。
pd.read_csv(r"data\students.csv",usecols=["name","birthday"])#name#0朱夢雪#1許文博#2張兆媛#3付延旭#4王杰#5董澤宇
(1) encoding:表示這只編碼格式,utf-8,gbk。
pd.read_csv(r"data\students_gbk.csv")#UnicodeDecodeError
如果提示錯誤喂 UnicodeDecodeError —> 需要想到編碼問題。
pandas 默認使用 utf-8 格式讀取。
pd.read_csv(r"data\students_gbk.csv",encoding="gbk")#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
(2) dtype:在讀取數據的時候,設定字段的類型。
比如,公司員工的 id 一般是:00001234,如果默認讀取的時候,會顯示為 1234,所以這個時候要把他轉為字符串類型,才能正常顯示為 00001234。
df=pd.read_csv(r"data\students_step_001.csv",sep="|")df#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
我們將 id 的數據類型設置為字符串,便可以顯示為 001 之類的。
df=pd.read_csv(r"data\students_step_001.csv",sep="|",dtype={"id":str})df#idnameaddressgenderbirthday#0001朱夢雪地球村女2004/11/2#1002許文博月亮星女2003/8/7#2003張兆媛艾爾星女2004/11/2#3004付延旭克哈星男2003/10/11#4005王杰查爾星男2002/6/12#5006董澤宇塔桑尼斯男2002/2/12
(3) converters:在讀取數據的時候對列數據進行變換.
例如將 id 增加 10,但是注意 int(x),在使用 converters 參數時,解析器默認所有列的類型為 str,所以需要進行類型轉換。
pd.read_csv('data\students.csv',converters={"id":lambdax:int(x)+10})#idnameaddressgenderbirthday#011朱夢雪地球村女2004/11/2#112許文博月亮星女2003/8/7#213張兆媛艾爾星女2004/11/2#314付延旭克哈星男2003/10/11#415王杰查爾星男2002/6/12#516董澤宇塔桑尼斯男2002/2/12
(4) true_values 和 false_values:指定哪些值應該被清洗為 True,哪些值被清洗為 False。
我們以性別為例,男設置為 True,女設置為 False。
pd.read_csv('data\students.csv',true_values=['男'],false_values=['女'])#idnameaddressgenderbirthday#01朱夢雪地球村False2004/11/2#12許文博月亮星False2003/8/7#23張兆媛艾爾星False2004/11/2#34付延旭克哈星True2003/10/11#45王杰查爾星True2002/6/12#56董澤宇塔桑尼斯True2002/2/12
這里的替換規則為,只有當某一列的數據類別全部出現在 true_values + false_values 里面,才會被替換。
(5) skiprows:表示過濾行,想過濾掉哪些行,就寫在一個列表里面傳遞給 skiprows 即可。注意的是,這里是先過濾,然后再確定表頭,比如:
pd.read_csv('data\students.csv',skiprows=[0,3])#1朱夢雪地球村女2004/11/2#02許文博月亮星女2003/8/7#14付延旭克哈星男2003/10/11#25王杰查爾星男2002/6/12#36董澤宇塔桑尼斯男2002/2/12
這里把第一行過濾掉了,因為第一行是表頭,所以在過濾掉之后第二行就變成表頭了。 當然里面除了傳入具體的數值,來表明要過濾掉哪些行,還可以傳入一個函數。
pd.read_csv('data\students.csv',skiprows=lambdax:x>0andx%2==0)#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#13張兆媛艾爾星女2004/11/2#25王杰查爾星男2002/6/12
由于索引從 0 開始,所以凡是索引大于 0、并且%2 等于 0 的記錄都過濾掉。索引大于 0,是為了保證表頭不被過濾掉。
(6) skipfooter:表示從文件末尾過濾行。
pd.read_csv('data\students.csv',skipfooter=1)
上述代碼運行后會出現報錯,并且表格中的數據都變成亂碼,具體原因下方有解釋。
pd.read_csv('data\students.csv',skipfooter=1,engine="python",encoding="utf-8")#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12
pandas 解析數據時用的引擎,目前解析引擎有兩種:c、python。默認為 c,因為 c 引擎解析速度更快,但是特性沒有 python 引擎全。
skipfooter 接收整型,表示從結尾往上過濾掉指定數量的行,因為引擎退化為 python,那么要手動指定 engine=“python”,不然會警告。另外需要指定 encoding=“utf-8”,因為 csv 存在編碼問題,當引擎退化為 python 的時候,在 Windows 上讀取會亂碼。
(7) nrows:表示設置一次性讀入的文件行數,在讀入大文件時很有用,比如 16G 內存的 PC 無法容納幾百 G 的大文件。
pd.read_csv('data\students.csv',nrows=3)#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7#23張兆媛艾爾星女2004/11/2
na_values:該參數可以配置哪些值需要處理成 NaN。
pd.read_csv('data\students.csv',na_values=["女","朱夢雪"])#idnameaddressgenderbirthday#01NaN地球村NaN2004/11/2#12許文博月亮星NaN2003/8/7#23張兆媛艾爾星NaN2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
可以看到將女和朱夢雪設置成了NaN,這里的情況是不同的列中包含了不同的值。
parse_dates:指定某些列為時間類型,這個參數一般搭配 date_parser 使用。
date_parser:是用來配合 parse_dates 參數的,因為有的列雖然是日期,但沒辦法直接轉化,需要我們指定一個解析格式。
df=pd.read_csv('data\students.csv')df.dtypes#idint64#nameobject#addressobject#genderobject#birthdayobject#dtype:object
我們通過 parse_dates 將 birthday 設置為時間類型。
df=pd.read_csv('data\students.csv',parse_dates=["birthday"])df.dtypes#idint64#nameobject#addressobject#genderobject#birthdaydatetime64[ns]#dtype:object
(1) iterator:迭代器,iterator 為 bool 類型,默認為 False。
如果為 True,那么返回一個 TextFileReader 對象,以便逐塊處理文件。這個在文件很大、內存無法容納所有數據文件時,可以分批讀入,依次處理。
chunk=pd.read_csv('data\students.csv',iterator=True)chunk#<pandas.io.parsers.TextFileReaderat0x1b27f00ef88>
我們已經對文件進行了分塊操作,可以先提取出前兩行。
print(chunk.get_chunk(2))#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7
文件還剩下四行,但是我們指定讀取100,那么也不會報錯,不夠指定的行數,那么有多少返回多少。
print(chunk.get_chunk(100))#idnameaddressgenderbirthday#23張兆媛艾爾星女2004/11/2#34付延旭克哈星男2003/10/11#45王杰查爾星男2002/6/12#56董澤宇塔桑尼斯男2002/2/12
這里需要注意的是,在讀取完畢之后,再讀的話就會報錯了。(2) chunksize:整型,默認為 None,設置文件塊的大小。chunksize 還是返回一個類似于迭代器的對象,當我們調用 get_chunk,如果不指定行數,那么就是默認的 chunksize。
chunk=pd.read_csv('data\students.csv',chunksize=2)print(chunk)print(chunk.get_chunk())#<pandas.io.parsers.TextFileReaderobjectat0x000001B27F05C5C8>#idnameaddressgenderbirthday#01朱夢雪地球村女2004/11/2#12許文博月亮星女2003/8/7
我們再使用兩次 print(chunk.get_chunk()) 就可以分步讀取出所有的數據,因為這里的 chunksize 設置為 2。
我們也可以指定 chunk.get_chunk() 的參數。
以上便是 pandas 的 read_csv 函數中絕大部分參數了,同時其中的部分參數也適用于讀取其它類型的文件。
其實在讀取 csv 文件時所使用的參數不多,很多參數平常我們都不會用到的,不過不妨礙我們了解一下,因為在某些特定的場景下它們是可以很方便地幫我們解決一些問題的。
個人感覺分塊讀取這個參數最近在工作中提高了很大的效率。
到此,相信大家對“Python中Pandas怎么讀取文件和讀取CSV參數”有了更深的了解,不妨來實際操作一番吧!這里是本站網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
哈嘍小伙伴們 ,今天給大家科普一個小知識。在日常生活中我們或多或少的都會接觸到經濟危機的根源在于方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于經濟危機的根源在于的相關內容。經濟危機產生的根源在于資本剝削雇傭勞動生產方式的基本矛盾,也就是資本主義生產關系與生產力之間的矛盾。經濟危機在早期的商品生產中就已經出現,當然和貨幣作為市場流通手段是有著緊密聯系的。后期由于社會的進步發展...
國美易卡是國美金融旗下的現金貸、分期、信用卡代還產品,之前名叫美易分,有很多人想在國美易卡提現,但是不知道到賬的時間,那么國美易卡提現成功多久到賬?國美易卡審核要多久?國美易卡申請條件,下面一起來看看吧。國美易卡在填寫完個人資料、完成認證后會給予一定的額度,分為提現額度、購物分期、信用卡代還,其中提現額度是可以提到銀行卡內的,如果發現提現額度為零,那么使用其他額度一段時間后就可以提現了。另外如果是...
隨著人們消費觀念的改變,各種的消費貸款或者信用卡充斥到每個人的生活中,宣傳的賣點也是各具特色的,有的說看電影優惠,有的說購物打折,有的是酒店打折,適合不同的人群的,比如說酒店打折適合經常出去旅游或者出差的人,黑卡這個詞語,估計很多人都聽說過是身份的象征,是財富的代名詞,那么環球黑卡是騙子嗎?最近還是很火的,為此小編給大家介紹一下。環球黑卡欺詐是真的么?1、環球黑卡(BLACK MAGIC)是杭州冒...