如何用 pandas 讀取 csv 和 Excel 數據

本文采用真實的股票數據作為案例,教你如何在Python中讀取常用的數據文件。

內容:

  • 讀取csv數據
  • 讀取Excel數據
  • 合并多張表

數據文件下載地址:

讀取csv數據

csv文件用逗號來分隔數值,是常用的數據格式之一,其具體形式可參考上面給出的數據文件。接下來我們將使用 Python 中的 pandas 數據分析包來進行數據的讀取和查看。

  • pandas.read_csv(): 讀取csv格式數據,并存儲成數據框 DataFrame 格式。
  • df.head(): 顯示數據框 df 的前5行。
  • df.info(): 顯示數據摘要。
# 導入pandas包
import pandas as pd

# 讀取csv文件
nasdaq = pd.read_csv('nasdaq-listings.csv')

# 顯示前10行數據
print(nasdaq.head(10))
  Stock Symbol           Company Name  Last Sale  Market Capitalization  \
0         AAPL             Apple Inc.     141.05           7.400000e+11   
1        GOOGL          Alphabet Inc.     840.18           5.810000e+11   
2         GOOG          Alphabet Inc.     823.56           5.690000e+11   
3         MSFT  Microsoft Corporation      64.95           5.020000e+11   
4         AMZN       Amazon.com, Inc.     884.67           4.220000e+11   
5           FB         Facebook, Inc.     139.39           4.030000e+11   
6        CMCSA    Comcast Corporation      37.14           1.760000e+11   
7         INTC      Intel Corporation      35.25           1.660000e+11   
8         CSCO    Cisco Systems, Inc.      32.42           1.620000e+11   
9         AMGN             Amgen Inc.     161.61           1.190000e+11   

  IPO Year             Sector  \
0     1980         Technology   
1      NAN         Technology   
2     2004         Technology   
3     1986         Technology   
4     1997  Consumer Services   
5     2012         Technology   
6      NAN  Consumer Services   
7      NAN         Technology   
8     1990         Technology   
9     1983        Health Care   

                                            Industry Last Update  
0                             Computer Manufacturing     4/26/17  
1    Computer Software: Programming, Data Processing     4/24/17  
2    Computer Software: Programming, Data Processing     4/23/17  
3            Computer Software: Prepackaged Software     4/26/17  
4                     Catalog/Specialty Distribution     4/24/17  
5    Computer Software: Programming, Data Processing     4/26/17  
6                                Television Services     4/26/17  
7                                     Semiconductors     4/23/17  
8                  Computer Communications Equipment     4/23/17  
9  Biotechnology: Biological Products (No Diagnos...     4/24/17  

使用 .info() 方法,可查看數據框的摘要信息。

# 查看數據摘要
nasdaq.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1115 entries, 0 to 1114
Data columns (total 8 columns):
Stock Symbol             1115 non-null object
Company Name             1115 non-null object
Last Sale                1115 non-null float64
Market Capitalization    1115 non-null float64
IPO Year                 1115 non-null object
Sector                   1115 non-null object
Industry                 1115 non-null object
Last Update              1115 non-null object
dtypes: float64(2), object(6)
memory usage: 69.8+ KB

從上面列出的信息可知,這份納斯達克股票數據包括股票代碼(Stock Symbol),公司名(Company Name),價格(Last Sale),市值(Market Capitalization),IPO年份(IPO Year), 行業(Sector), 產業(Industry),更新時間(Last Update)這8列。

讀取的數據需要能還原原始數據中的信息,比如 Last Update 應該是時間格式的數據,而在 IPO Year 中存在 NAN這類缺失的數值,這些目前都沒有反應出來。所以下面需要設置參數,改進csv文件的讀取方式。

pandas.read_csv() 參數

  • na_vlaues: 設置缺失值形式。
  • parse_dates: 將指定的列解析成時間日期格式。
nasdaq = pd.read_csv('nasdaq-listings.csv', na_values='NAN', parse_dates=['Last Update'])
print(nasdaq.head())
  Stock Symbol           Company Name  Last Sale  Market Capitalization  \
0         AAPL             Apple Inc.     141.05           7.400000e+11   
1        GOOGL          Alphabet Inc.     840.18           5.810000e+11   
2         GOOG          Alphabet Inc.     823.56           5.690000e+11   
3         MSFT  Microsoft Corporation      64.95           5.020000e+11   
4         AMZN       Amazon.com, Inc.     884.67           4.220000e+11   

   IPO Year             Sector  \
0    1980.0         Technology   
1       NaN         Technology   
2    2004.0         Technology   
3    1986.0         Technology   
4    1997.0  Consumer Services   

                                          Industry Last Update  
0                           Computer Manufacturing  2017-04-26  
1  Computer Software: Programming, Data Processing  2017-04-24  
2  Computer Software: Programming, Data Processing  2017-04-23  
3          Computer Software: Prepackaged Software  2017-04-26  
4                   Catalog/Specialty Distribution  2017-04-24  
nasdaq.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1115 entries, 0 to 1114
Data columns (total 8 columns):
Stock Symbol             1115 non-null object
Company Name             1115 non-null object
Last Sale                1115 non-null float64
Market Capitalization    1115 non-null float64
IPO Year                 593 non-null float64
Sector                   1036 non-null object
Industry                 1036 non-null object
Last Update              1115 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(3), object(4)
memory usage: 69.8+ KB

讀取Excel數據

Excel文件是傳統的數據格式,但面對海量數據時,用編程的方法來處理數據更有優勢。這里示例用的數據文件如下圖所示,注意它有3張sheet表。

類似于csv文件,可以使用 pandas.read_excel() 函數來讀取 Excel 文件,并存儲成數據框格式。

pandas.read_excel() 讀取 Excel 文件,其參數如下:

  • sheet_name: 設置讀取的 sheet 名。
  • na_values: 設置缺失值的形式。
# 讀取Excel數據,選取nyse這一頁
nyse = pd.read_excel('listings.xlsx', sheet_name='nyse', na_values='n/a')

# 顯示前幾行
print(nyse.head())
  Stock Symbol            Company Name  Last Sale  Market Capitalization  \
0          DDD  3D Systems Corporation      14.48           1.647165e+09   
1          MMM              3M Company     188.65           1.127366e+11   
2         WBAI         500.com Limited      13.96           5.793129e+08   
3         WUBA             58.com Inc.      36.11           5.225238e+09   
4          AHC   A.H. Belo Corporation       6.20           1.347351e+08   

   IPO Year             Sector  \
0       NaN         Technology   
1       NaN        Health Care   
2    2013.0  Consumer Services   
3    2013.0         Technology   
4       NaN  Consumer Services   

                                          Industry  
0          Computer Software: Prepackaged Software  
1                       Medical/Dental Instruments  
2            Services-Misc. Amusement & Recreation  
3  Computer Software: Programming, Data Processing  
4                             Newspapers/Magazines  
# 顯示摘要信息
nyse.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3147 entries, 0 to 3146
Data columns (total 7 columns):
Stock Symbol             3147 non-null object
Company Name             3147 non-null object
Last Sale                3079 non-null float64
Market Capitalization    3147 non-null float64
IPO Year                 1361 non-null float64
Sector                   2177 non-null object
Industry                 2177 non-null object
dtypes: float64(3), object(4)
memory usage: 172.2+ KB

這里其實只讀取了一張sheet表,但是該Excel文件一共有三張sheet表,下面將演示如何讀取所有的sheet表。

  • pd.ExcelFile():將 Excel 文件存儲成 ExcelFile 對象。
  • ExcelFile.sheet_names : 獲取ExcelFile的所有sheet表的名稱,存儲在python列表中。
# 將Excel文件讀取成 ExcelFile 格式
xls = pd.ExcelFile('listings.xlsx')

# 獲取sheet表的名稱
exchanges = xls.sheet_names
print(exchanges)
['amex', 'nasdaq', 'nyse']

然后仍然使用 pd.read_excel() 讀取 ExcelFile 數據,但傳遞給參數 sheet_name 的值是上述 exchanges 列表。返回值 listings 是字典格式,每一個元素對應的是一張表的DataFrame。

# 讀取所有sheet的數據,存儲在字典中
listings = pd.read_excel(xls, sheet_name=exchanges, na_values='n/a')

# 查看 nasdaq 表的摘要信息
listings['nasdaq'].info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3167 entries, 0 to 3166
Data columns (total 7 columns):
Stock Symbol             3167 non-null object
Company Name             3167 non-null object
Last Sale                3165 non-null float64
Market Capitalization    3167 non-null float64
IPO Year                 1386 non-null float64
Sector                   2767 non-null object
Industry                 2767 non-null object
dtypes: float64(3), object(4)
memory usage: 173.3+ KB

合并多張表

現在我們希望將Excel中的多張表合并在一起,由于他們具有相同的列結構,所以可以進行簡單的堆疊。下面將 nyse 和 nasdaq 這兩張表連接在一起,使用 pd.concat() 函數。

pd.concat() 函數用于連接多個DataFrame數據框,注意這些被合并的DataFrame需要放在列表中。

# 讀取 nyse 和nasdaq 這兩張表的數據
nyse = pd.read_excel('listings.xlsx', sheet_name='nyse', na_values='n/a')
nasdaq = pd.read_excel('listings.xlsx', sheet_name='nasdaq', na_values='n/a')

# 添加一列 Exchange,標記來自哪張表的數據
nyse['Exchange'] = 'NYSE'
nasdaq['Exchange'] = 'NASDAQ'

# 拼接兩個DataFrame
combined_listings = pd.concat([nyse, nasdaq])  # 注意這里的[ ]
combined_listings.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 6314 entries, 0 to 3166
Data columns (total 8 columns):
Stock Symbol             6314 non-null object
Company Name             6314 non-null object
Last Sale                6244 non-null float64
Market Capitalization    6314 non-null float64
IPO Year                 2747 non-null float64
Sector                   4944 non-null object
Industry                 4944 non-null object
Exchange                 6314 non-null object
dtypes: float64(3), object(5)
memory usage: 444.0+ KB

如果要合并所有的表,我們同樣可以通 ExcelFile.sheet_names 來獲取所有的sheet表的名稱,然后通過循環讀取每一個sheet表的數據,最后使用 pd.concat() 函數來合并所有sheet表。

# 創建 ExcelFile 變量
xls = pd.ExcelFile('listings.xlsx')

# 獲取sheet名
exchanges = xls.sheet_names

# 創建空列表
listings = []

# 使用循環逐一導入每一頁的數據,并存儲在列表中
for exchange in exchanges:
    listing = pd.read_excel(xls, sheet_name=exchange, na_values='n/a')
    listing['Exchange'] = exchange
    listings.append(listing)

# 合并數據
listing_data = pd.concat(listings)

# 查看合并后數據的摘要
listing_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 6674 entries, 0 to 3146
Data columns (total 8 columns):
Stock Symbol             6674 non-null object
Company Name             6674 non-null object
Last Sale                6590 non-null float64
Market Capitalization    6674 non-null float64
IPO Year                 2852 non-null float64
Sector                   5182 non-null object
Industry                 5182 non-null object
Exchange                 6674 non-null object
dtypes: float64(3), object(5)
memory usage: 469.3+ KB

注:本文是 DataCamp 課程 Importing & Managing Financial Data in Python
的學習筆記。更多該課程的文章:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容