【学习笔记】 第06章 数据加载、存储与文件格式
前言
早上起床迷迷糊糊的困得要死,本来打算去上最优化的,但是还是算了,留在宿舍继续学Numpy吧,等会自然辩证法再去(要点名),留都留了,好好学习吧!
读写文本格式的数据
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。
表6-1对它们进行了总结,其中read_csv和read_table可能会是今后用得最多的
由于之前使用github上面下载的一个爬虫工具,可以爬下B站单个视频的弹幕,所以本章我直接使用之前爬过的弹幕(所爬视频是我自己剪辑的,有15w播放),转成csv格式后进行学习
In [3]: df=pd.read_csv('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv')
In [4]: df
Out[4]:
出现时间 弹幕类型 字的大小 颜色 ... unknown_6 unknown_7 unknown_8 弹幕内容
0 212.321 1 25 16777215 ... a395661f 33601096322646021 10 如果我可以拥有这么可爱的女朋友,我可以改变取向
1 180.129 1 25 16777215 ... a395661f 33601079539662851 10 非常正能量的日剧,女主我太爱了
2 76.384 1 25 16777215 ... 9e55fb57 32005160809005059 10 草到这里我憋不住了
3 21.641 1 25 16777215 ... 2cb234df 31925199932751877 10 我以为我手机响了
4 219.637 1 25 16777215 ... 3436b8b 31290085198528519 10 如果十元这样和我说的话,我肯定回答:我可以为了你工作吗?
.. ... ... ... ... ... ... ... ... ...
317 86.646 1 25 16777215 ... b1cc5e9a 27873327088926722 1 哭死了
318 63.151 1 25 16777215 ... d1d65a5f 27742363752857604 1 哭死
319 80.183 1 25 16777215 ... 6640e67d 27677135002402816 1 我这集哭死
320 26.889 1 25 16777215 ... 24aeb8ec 27096032161562624 1 歪
321 33.545 1 25 16777215 ... 52591e39 27036517693128708 1 歪
[322 rows x 10 columns]
In [5]: pd.read_table('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv',sep='.')
Out[5]:
出现时间,弹幕类型,字的大小,颜色,弹幕添加时间戳,unknown_5,unknown_6,unknown_7,unknown_8,弹幕内容
212 32100,1,25,16777215,1591231180,0,a395661f,3360...
180 12900,1,25,16777215,1591231148,0,a395661f,3360...
76 38400,1,25,16777215,1588187174,0,9e55fb57,3200...
21 64100,1,25,16777215,1588034661,0,2cb234df,3192...
219 63700,1,25,16777215,1586823276,0,3436b8b,31290...
.. ...
86 64600,1,25,16777215,1580306327,0,b1cc5e9a,2787...
63 15100,1,25,16777215,1580056534,0,d1d65a5f,2774...
80 18300,1,25,16777215,1579932120,0,6640e67d,2767...
26 88900,1,25,16777215,1578823754,0,24aeb8ec,2709...
33 54500,1,25,16777215,1578710240,0,52591e39,2703...
[322 rows x 1 columns]
In [6]: pd.read_table('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv',sep=',')
Out[6]:
出现时间 弹幕类型 字的大小 颜色 弹幕添加时间戳 unknown_5 unknown_6 unknown_7 unknown_8 弹幕内容
0 212.321 1 25 16777215 1591231180 0 a395661f 33601096322646021 10 如果我可以拥有这么可爱的女朋友,我可以改变取向
1 180.129 1 25 16777215 1591231148 0 a395661f 33601079539662851 10 非常正能量的日剧,女主我太爱了
2 76.384 1 25 16777215 1588187174 0 9e55fb57 32005160809005059 10 草到这里我憋不住了
3 21.641 1 25 16777215 1588034661 0 2cb234df 31925199932751877 10 我以为我手机响了
4 219.637 1 25 16777215 1586823276 0 3436b8b 31290085198528519 10 如果十元这样和我说的话,我肯定回答:我可以为了你工作吗?
.. ... ... ... ... ... ... ... ... ... ...
317 86.646 1 25 16777215 1580306327 0 b1cc5e9a 27873327088926722 1 哭死了
318 63.151 1 25 16777215 1580056534 0 d1d65a5f 27742363752857604 1 哭死
319 80.183 1 25 16777215 1579932120 0 6640e67d 27677135002402816 1 我这集哭死
320 26.889 1 25 16777215 1578823754 0 24aeb8ec 27096032161562624 1 歪
321 33.545 1 25 16777215 1578710240 0 52591e39 27036517693128708 1 歪
[322 rows x 10 columns]
In [14]: pd.read_csv('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv',index_col='弹幕内容')
Out[14]:
出现时间 弹幕类型 字的大小 颜色 弹幕添加时间戳 unknown_5 unknown_6 unknown_7 unknown_8
弹幕内容
如果我可以拥有这么可爱的女朋友,我可以改变取向 212.321 1 25 16777215 1591231180 0 a395661f 33601096322646021 10
非常正能量的日剧,女主我太爱了 180.129 1 25 16777215 1591231148 0 a395661f 33601079539662851 10
草到这里我憋不住了 76.384 1 25 16777215 1588187174 0 9e55fb57 32005160809005059 10
我以为我手机响了 21.641 1 25 16777215 1588034661 0 2cb234df 31925199932751877 10
如果十元这样和我说的话,我肯定回答:我可以为了你工作吗? 219.637 1 25 16777215 1586823276 0 3436b8b 31290085198528519 10
... ... ... ... ... ... ... ... ... ...
哭死了 86.646 1 25 16777215 1580306327 0 b1cc5e9a 27873327088926722 1
哭死 63.151 1 25 16777215 1580056534 0 d1d65a5f 27742363752857604 1
我这集哭死 80.183 1 25 16777215 1579932120 0 6640e67d 27677135002402816 1
歪 26.889 1 25 16777215 1578823754 0 24aeb8ec 27096032161562624 1
歪 33.545 1 25 16777215 1578710240 0 52591e39 27036517693128708 1
[322 rows x 9 columns]
除此之外,在记录一些常见的用法
有些情况下,有些表格可能不是用固定的分隔符去分隔字段的(比如空白符或其它模式),虽然可以手动对数据进行规整,这里的字段是被数量不同的空白字符间隔开的。这种情况下,你可以传递一个正则表达式作为read_table的分隔符
这些解析器函数还有许多参数可以帮助你处理各种各样的异形文件格式(表6-2列出了一些)。比如说,你可以用skiprows跳过文件的第一行、第三行和第四行
缺失值处理是文件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串),要么用某个标记值表示。默认情况下,pandas会用一组经常出现的标记值进行识别,比如NA及NULL
逐块读取文本文件
如果只想读取几行(避免读取整个文件),通过nrows进行指定即可
要逐块读取文件,可以指定chunksize(行数)
read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如说,我们可以迭代处理csv,将值计数聚合到某列中
In [21]: chunker = pd.read_csv('E:/我的文件/学习/硕士/研一下学期/numpy/unnatural.csv', chunksize=100)
In [22]: tot=pd.Series([])
<ipython-input-22-68aa5c24f913>:1: DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
tot=pd.Series([])
In [27]: tot
Out[27]:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1.0
6 1.0
Bgm是什么 1.0
bgm是什么 2.0
qqq 1.0
...
这集哭死了 1.0
这集真的 1.0
这集真的唉:-( 1.0
那是六郎啊 1.0
都给我哭 5.0
Length: 80, dtype: float64
将数据写出到文本格式
利用DataFrame的to_csv方法,我们可以将数据写到一个以逗号分隔的文件中
Series也有一个to_csv方法:
In [50]: dates = pd.date_range('1/1/2000', periods=7)
In [51]: ts = pd.Series(np.arange(7), index=dates)
In [52]: ts.to_csv('examples/tseries.csv')
In [53]: !cat examples/tseries.csv
2000-01-01,0
2000-01-02,1
2000-01-03,2
2000-01-04,3
2000-01-05,4
2000-01-06,5
2000-01-07,6
处理分隔符格式
读取Microsoft Excel文件
pandas的ExcelFile类或pandas.read_excel函数支持读取存储在Excel 2003(或更高版本)中的表格型数据。这两个工具分别使用扩展包xlrd和openpyxl读取XLS和XLSX文件。可以用pip或conda安装它们。
如果要将pandas数据写入为Excel格式,你必须首先创建一个ExcelWriter,然后使用pandas对象的to_excel方法将数据写入到其中
In [108]: writer = pd.ExcelWriter('examples/ex2.xlsx')
In [109]: frame.to_excel(writer, 'Sheet1')
In [110]: writer.save()
你还可以不使用ExcelWriter,而是传递文件的路径到to_excel:
In [111]: frame.to_excel('examples/ex2.xlsx')
Web APIs交互
(爬虫?)
许多网站都有一些通过JSON或其他格式提供数据的公共API。通过Python访问这些API的办法有不少。一个简单易用的办法(推荐)是requests包
In [31]: import requests
In [32]: url = 'https://api.github.com/repos/pandas-dev/pandas/issues'
In [33]: resp = requests.get(url)
In [34]: resp
Out[34]: <Response [200]>
In [35]: data = resp.json()
In [36]: data[0]['title']
Out[36]: 'Parse start/end only if Index of type Datetime'
In [37]: issues = pd.DataFrame(data, columns=['number', 'title',
...: .....: 'labels', 'state'])
In [38]: issues
Out[38]:
number title labels state
0 46385 Parse start/end only if Index of type Datetime [] open
1 46384 BUG: Styler renders booleans True/False as dig... [{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ=... open
2 46383 BUG: subset parameter of DataFrameGroupBy.valu... [{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ=... open
3 46382 Bug gb cummax [{'id': 233160, 'node_id': 'MDU6TGFiZWwyMzMxNj... open
4 46381 BUG: pandas.io.formats.style.Styler.to_excel d... [{'id': 76811, 'node_id': 'MDU6TGFiZWw3NjgxMQ=... open
.. ... ... ... ...
25 46353 DOC: Document that astype() for Series and Dat... [{'id': 134699, 'node_id': 'MDU6TGFiZWwxMzQ2OT... open
26 46352 ENH: read_excel should assume engine when pass... [{'id': 76812, 'node_id': 'MDU6TGFiZWw3NjgxMg=... open
27 46351 Question: why use Azure for CI? [{'id': 48070600, 'node_id': 'MDU6TGFiZWw0ODA3... open
28 46348 Series.map Performance Improvement When Using ... [{'id': 8935311, 'node_id': 'MDU6TGFiZWw4OTM1M... open
29 46346 WIP Use provision-with-micromamba [{'id': 48070600, 'node_id': 'MDU6TGFiZWw0ODA3... open
[30 rows x 4 columns]
数据库交互
在商业场景下,大多数数据可能不是存储在文本或Excel文件中。基于SQL的关系型数据库(如SQL Server、PostgreSQL和MySQL等)使用非常广泛,其它一些数据库也很流行。数据库的选择通常取决于性能、数据完整性以及应用程序的伸缩性需求。
将数据从SQL加载到DataFrame的过程很简单,此外pandas还有一些能够简化该过程的函数。例如,书中将使用SQLite数据库(通过Python内置的sqlite3驱动器)
总结
访问数据通常是数据分析的第一步。在本章中,我们已经学了一些有用的工具。在接下来的章节中,我们将深入研究数据规整、数据可视化、时间序列分析和其它主题。
等会自然辩证法课会将未读的JSON数据、XML和HTMLWeb信息收集、利用lxml.objectify解析XML、二进制数据格式部分补上
本文来自博客园,作者:Lugendary,转载请注明原文链接:https://www.cnblogs.com/lugendary/p/16011604.html