如何用 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阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容