本文大綱
我覺得很有必要講述這個文章,進行資料處理的第一步就是Python資料讀取。但是你可能沒想到,在進行資料讀取的同時,我們其實可以配合相關參數做很多事兒,這對于後續的資料處理都是極其有幫助。
read_excel()函數和read_csv()函數,在參數上面有很多相同點,是以我就以read_excel()函數為例,進行詳細的說明。
參數詳解
1)sheet_name參數
- 含義:選擇要讀取的sheet表;
- sheet_name=0表示預設讀取第一個sheet表,等同于sheet_name=“sheet名稱”;
- sheet_name=[“sheet名”,0]會傳回一個字典,然後可以利用鍵擷取每一個sheet表中的資料;
- sheet_name=None也會傳回一個字典,但是會傳回全部的sheet表;
① sheet_name=0和sheet_name="Sheet1"
# 下面這兩個讀取方式等同。
#df2 = pd.read_excel("readexcel.xlsx",sheet_name=0)
df2 = pd.read_excel("readexcel.xlsx",sheet_name="Sheet1")
df2
結果如下:
② sheet_name=[“sheet名”,0]
df2 = pd.read_excel("readexcel.xlsx",sheet_name=[0,1])
df2
結果如下:
接着,我們可以使用鍵值對的方式,擷取每個sheet表中的資料。
注:關于sheet_name=None效果同上,隻不過會傳回所有的sheet表中的資料。
2)header參數
- 含義:指定某一行作為表頭;
- header=None專門針對沒有表頭的表,這也是預設值;
- header=1指定第一行作為表頭;
- header=[]主要針對複合表頭的情況;
① header=None
df3 = pd.read_excel("header.xlsx",header=None)
df3
結果如下:
② header=1
df3 = pd.read_excel("header.xlsx",sheet_name=2,header=1)
df3
結果如下:
③ header=[]
df3 = pd.read_excel("header.xlsx",sheet_name=3,header=[0,1],index_col=0)
df3
結果如下:
注意:上述用到了一個index_col參數,這個參數用于指定作為行索引的列,我就不詳細舉例了,看看下圖。
3)usecols參數
- 含義:選擇讀取一張表中的指定列;
- usecols=None也是預設情況,表示讀取所有列;
- usecols=[A,C]表示隻選取A列和C列。usecols=[A,C:E]表示選擇A列,C列、D列和E列;
- usecols=[0,2]表示隻選擇第一列和第三列;
- usecols=["列名1","列名2"...]這也是推薦使用的一種寫法;
① usecols=None
df4 = pd.read_excel("usecols.xlsx",usecols=None) # 預設
df4
結果如下:
② usecols=[A,C]
df4 = pd.read_excel("usecols.xlsx",usecols="A,C")
df4
結果如下:
③ usecols=[A,C:D]
df4 = pd.read_excel("usecols.xlsx",usecols="A,C:D")
df4
結果如下:
④ usecols=[0,2]
df4 = pd.read_excel("usecols.xlsx",usecols=[0,2])
df4
結果如下:
⑤ usecols=["列名1","列名2"...]
這種方式照說是沒有任何問題的,但是在我這邊運作總是無結果,我很納悶,大家可以下去試試。
4)names參數
- 含義:如果表中沒有表頭,可以用這個參數添加一個标題。如果表中有表頭,可以用這個參數修改标題。
names = ["月份","國文","英語"]
df6 = pd.read_excel("names.xlsx",header=None,names=names)
df6
結果如下:
5)dtype參數
- 含義:讀取資料時,設定每一列的資料類型(重要);
- dtype={}傳入一個字典,類似于{"列名":"類型"};
df7 = pd.read_excel("dtype.xlsx")
df7.dtypes
------------------------------------------------------
df7 = pd.read_excel("dtype.xlsx",dtype={"年齡":"str"})
df7.dtypes
結果如下:
6)parse_dates參數
- 含義:指定将哪些列,解析為日期格式;
- parse_dates=True是專門用于将行索引,解析為日期格式;
- parse_dates=[0,1,2,3,4]和parse_dates=["列名1","列名2","列名3","列名4"],都是将指定列一起解析為日期格式;
- parse_dates=[[1,2,3]]和parse_dates=[["年","月","日"]],都是将多個列,解析為單個日期列;
- parse_dates={"日期":[1,2,3]}不僅将多個日期列解析為單個日期列,同時還為這一列命名;
① parse_dates=True
df8 = pd.read_excel("parse_dates",index_col=2,parse_dates=True)
df8.index
結果如下:
② parse_dates=[0,1]和parse_dates=["列名1","列名2"]
df8 = pd.read_excel("parse_dates",parse_dates=[0,1,2,3,4])
df8.dtypes
# 這個代碼效果同上
df8 = pd.read_excel("parse_dates.xlsx",
parse_dates=["數值日期1","文本日期2","文本日期3","文本日期4","文本日期5"])
結果如下:
③ parse_dates=[[1,2,3]]和parse_dates=[["年","月","日"]]
#df8 = pd.read_excel("parse_dates.xlsx",sheet_name="Sheet2",parse_dates=[["年","月","日"]])
df8 = pd.read_excel("parse_dates.xlsx",sheet_name="Sheet2",parse_dates=[[1,2,3]])
df8
結果如下:
④ parse_dates={"日期":[1,2,3]}
df8 = pd.read_excel("parse_dates.xlsx",sheet_name="Sheet2",parse_dates={"日期":[1,2,3]})
df8
結果如下:
7)date_parser參數
- 含義:利用lambda函數,将某個字元串列,解析為日期格式;
- 一般是配合parse_dates參數,一起使用;
df9 = pd.read_excel("date_parser.xlsx",parse_dates=[1],
date_parser=lambda x: pd.to_datetime(x,format="%Y年%m月%d"))
print(df9.dtypes)
df9
結果如下:
8)na_values參數
- 含義:用于将某些特定的值,解析為NaN值,然後便于我們後面做缺失值的處理;
- na_values=”值1“表示将所有資料中值1全部替換為NaN;
- na_values=[”值1“,"值2"]表示将所有資料中值1、值2全部替換為NaN;
- na_values={"列1":[”值1“,"值2"]}表示将第一列中所有的值1、值2全部替換為NaN;
① na_values=”值1“
df10 = pd.read_excel("na_values.xlsx",na_values=" ")
df10
結果如下:
② na_values=[”值1“,"值2"]
df10 = pd.read_excel("na_values.xlsx",na_values=["a","0"])
df10
結果如下:
③ na_values={"列1":[”值1“,"值2"]}
# 隻替換某一列中的某些值為NaN
df10 = pd.read_excel("na_values.xlsx",na_values={"列2":["0"," "]})
df10
結果如下:
9)converters參數
- 含義:對某一列使用Lambda函數,進行某種運算;
- 例如:converters={"工資":lambda x: x + 1000};
df11 = pd.read_excel("converters.xlsx",
converters={"位址":lambda x: "中國"+x,"工資":lambda x: x + 1000})
df11
結果如下:
背景回複"readexcel" 擷取本文所用到的素材!
由于微信平台算法改版,公号内容将不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星标我們和給我們多點點【在看】。星标具體步驟為:
(1)點選頁面最上方“小詹學Python”,進入公衆号首頁。
(2)點選右上角的小點點,在彈出頁面點選“設為星标”,就可以啦。
感謝支援,比心。