天天看點

Pandas詳解二十三之讀取CSV、Excel檔案讀取CSV檔案讀取Excel檔案

約定:

import pandas as pd
           

讀取CSV檔案

csv檔案以.csv字尾結尾,預設用’,’作為分隔符,pandas提供了pd.read_csv()函數供我們讀取csv檔案:

pd.read_csv(filepath_or_buffer, sep=’,’, delimiter=None, header=’infer’, names=None, index_col=None, usecols=None, squeeze=False, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None)

常用參數解釋:

filepath_or_buffer:檔案名、檔案具體或相對路徑、檔案對象

usecols:保留指定列

sep、delimiter:倆者均為檔案分割符号,或為正規表達式

header:當檔案中無列名需将其設為None

names:結合header=None,讀取時傳入列名

skiprows:忽略特定的行數

nrows:讀取一定行數

na_values:一組将其值轉換為NaN的特定值

sueeze:傳回Series對象

1 保留指定列

pd.read_csv('test.csv',usecols=[,])
           

代碼結果:

k1 values1
a 1
1 a 8
2 b 3
3 c 2

2 讀取無列名的csv檔案

若csv檔案沒有列名,則需要自行輸入列名,否則Pandas會自動添加列名。

pd.read_csv('test2.csv',header=None,names=['k1','k2','value1','value2'])
           

代碼結果:

k1 k2 value1 value2
a x 1 2
1 a y 8 3
2 b y 3 3
3 c z 2 9

3 讀入時指定列為索引

像上述讀入時,會自動添加索引:1,2,3,…,當檔案中包含索引字段,則可以讀入時指定特定列為索引。

  • 指定單索引
pd.read_csv('test.csv',index_col='k1')
           

代碼結果:

k2 values1 values2
k1
a x 1 2
a y 8 3
b y 3 3
c z 2 9
  • 指定階層化索引
pd.read_csv('test.csv',index_col=['k1','k2'])
           

代碼結果:

values1 values2
k1 k2
a x 1 2
y 8 3
b y 3 3
c z 2 9

4 忽略特定行數

需要注意的是,檔案的第一行若為列名,則也有可能被忽略

  • 傳入數值從特定行開始讀取
pd.read_csv('test2.csv',header=None,names=['k1','k2','value1','value2'],skiprows=)
           

代碼結果:

k1 k2 value1 value2
a y 8 3
1 b y 3 3
2 c z 2 9
  • 傳入清單忽略指定行
pd.read_csv('test.csv',skiprows=[,])
           

代碼結果:

k1 k2 values1 values2
a y 8 3
1 c z 2 9

5 讀取一定行數

pd.read_csv('test.csv',nrows=)
           

代碼結果:

k1 k2 values1 values2
a x 1 2
1 a y 8 3
2 b y 3 3

6 讀入時将特定值設為NaN

檔案中的空值因人而異,可能會是空,或者NaN,NA,IND等,pandas則有可能了解不了,這時則需要我們指定NaN标定值

pd.read_csv('test3.csv')
           

代碼結果:

k1 k2 values1 values2
a x 1 NaN
1 a y NaN 3.0
2 b y 3 NaN
3 c z IND 9.0
  • 清單傳入特定值
pd.read_csv('test3.csv',na_values=['IND'])
           

代碼結果:

k1 k2 values1 values2
a x 1.0 NaN
1 a y NaN 3.0
2 b y 3.0 NaN
3 c z NaN 9.0
  • 使用字典為不同列指定NaN标記值
pd.read_csv('test3.csv',na_values={'value1':['IND'],'k1':['b','c']})
           

代碼結果:

k1 k2 values1 values2
a x 1 NaN
1 a y NaN 3.0
2 NaN y 3 NaN
3 NaN z IND 9.0

7 傳回Series對象

當處理後的結果隻保留一列,但讀取後的結果是為DataFrame對象,讓squeeze=True則傳回Series對象。

print(type(pd.read_csv('test.csv',usecols=['k1'])))
print(type(pd.read_csv('test.csv',usecols=['k1'],squeeze=True)))
           

代碼結果:

<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'>
           

讀取Excel檔案

Excel檔案比csv特别的是excel可以有多個Sheet表格,當Excel檔案隻有單個Sheet表格時,用pd.read_excel()、pd.read_table()、甚至pd.read_csv()都可以,指定分隔符即可,當有多個Sheet表格時用pd.read_excel()更加靈活。

pd.read_excel(io, sheet_name=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None, usecols=None, parse_dates=False, date_parser=None, na_values=None, thousands=None, convert_float=True, converters=None, dtype=None, true_values=None, false_values=None, engine=None, squeeze=False, **kwds)

常用參數解釋:

filepath_or_buffer:檔案名、檔案具體或相對路徑、檔案流(open()函數打開等)

usecols:保留指定列

sep、delimiter:倆者均為檔案分割符号,或為正規表達式

header:當檔案中無列名需将其設為None

names:結合header=None,讀取時傳入列名

skiprows:忽略特定的行數

nrows:讀取一定行數

na_values:一組将其值轉換為NaN的特定值

sueeze:傳回Series對象

sheet_name:選擇excel檔案中的sheet表格,可為數值或string

這些參數的用法和pd.read_csv的參數用法一樣,故不再詳細介紹了。

1 讀取第一個Sheet表格

sheet_name預設為0

pd.read_excel('test4.xlsx')
           

代碼結果:

k1 k2 values1 values2
a x 1 2
1 a y 8 3
2 b y 3 3
3 c z 2 9

2 讀取指定Sheet表格

sheet_name可指定Sheet表格,可以是Sheetname或者Sheet的編号(從0開始)

pd.read_excel('test4.xlsx',sheet_name=,header=None,names=['k1','k2','value1','value2'])
#pd.read_excel('test4.xlsx',sheet_name='Sheet2',header=None,names=['k1','k2','value1','value2'])
           

代碼結果:

k1 k2 value1 value2
a x 1 2
1 a y 8 3
2 b y 3 3
3 c z 2 9

總結

read_csv/read_excel/read_table 這三個讀取檔案函數将會是我們最常用的函數,read_csv和read_table差不多一樣,不同的是前者sep=’,’,後者sep=’\t’。取csv用read_csv即可,讀取txt/json等等則可用read_table,讀取時指定sep即可。讀取excel檔案使用read_excel則為最好。

謝謝大家的浏覽,

希望我的努力能幫助到您,

共勉!