前言
访问数据是使用本书所介绍的这些工具的第一步。输入输出通常可以划分为几个大类:读取文本文件和其他更高效的磁盘存储格式, 加载数据库中的数据,利用Web API操作网络资源。
一、读写文本格式的数据
pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。表6-1对它们进行了总结,其中read_csv和read_table可能会是你今后用得最多的。
![e231c79187ae98fc8e4cd43f48066288.png](https://i-blog.csdnimg.cn/blog_migrate/41318f09b67ae06d52819874e07d6627.jpeg)
我将大致介绍一下这些函数在将文本数据转换为DataFrame时所用到的一些技术。 这些函数的选项可以划分为以下几个大类:
- 索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名。
- 类型推断和数据转换:包括用户定义值的转换、和自定义的缺失值标记列表等。
- 日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。
- 不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据)。
1.对(CSV)文本文件的操作
对文本的一些基本操作:
我们可以使用read_csv将其读入一个DataFrame,
还可以使用read_table,并指定分隔符:
![4ea74410d0cbe7c626435dea1e9e8063.png](https://i-blog.csdnimg.cn/blog_migrate/78c0690109466e63379fc55930b9d5ca.jpeg)
并不是所有文件都有标题行。这时候可以让pandas为其分配默认的列名,也可以自定义列名。
分配默认的列名:
![4fe70580a49152eec08be3ef34553003.png](https://i-blog.csdnimg.cn/blog_migrate/0ffa7a2ef89901a9a44a417da9747664.jpeg)
自定义列名:
![135079ee55bdef900d69fd840b731087.png](https://i-blog.csdnimg.cn/blog_migrate/d85c6476a529a1634a9155a09e168aac.png)
但是,要注意一件事,但文件没有标题行时,如果不标注header=None,则会默认的将第一行标注为标题行,我们可以看一个实例,和加了header=None时对比:
![41bd8f64c5dc060750022e1b2294f9ef.png](https://i-blog.csdnimg.cn/blog_migrate/417d18c5afee3fa3f7579b99db9dac15.jpeg)
如果你希望将message列做成DataFrame的索引。你可以明确表示要将该列放到索引4的位置上,也可以通过index_col参数指定"message":
![367866d02a7dd069c3c7762a904cfbac.png](https://i-blog.csdnimg.cn/blog_migrate/ff86c328c17ccb1ac3928fb109ceb34a.jpeg)
注:index_col=‘参数’,表示对行的索引进行修改。
如果希望将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表即可:
![5691f205d479afea12bfd56b5db0b001.png](https://i-blog.csdnimg.cn/blog_migrate/c5a150e135226b5f050160b14f145612.jpeg)
有些情况下,有些表格可能不是用固定的分隔符去分隔字段的(比如空白符或其它 模式)。看看下面这个文本文件:
![d00a352b36c2a4a4ea7f57e3e092fd80.png](https://i-blog.csdnimg.cn/blog_migrate/ed4d42187d2f2a4e8227a83ca42b17d7.jpeg)
虽然可以手动对数据进行规整,这里的字段是被数量不同的空白字符间隔开的。这种情况下,你可以传递一个正则表达式作为read_table的分隔符。可以用正则表达式表达为s+,于是有:
![1b339eee2cf8b82e0d359a33208e7047.png](https://i-blog.csdnimg.cn/blog_migrate/3cd65570735ed74cb78259911d8ec2a3.jpeg)
对于一些你想要跳过的文件某些行里的文字和其他内容,可以使用skiprows=[+行数]
![8891989362b312106ca7fef5e32d314e.png](https://i-blog.csdnimg.cn/blog_migrate/e28c714304e69a20825d58f852917601.jpeg)
处理缺失值:
缺失值处理是文件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串),要么用某个标记值表示。默认情况下,pandas会用一组经常出现的标记值进行识别,比如NA及NULL:
![9beb466aef44ecf32f860bb0aea6f00d.png](https://i-blog.csdnimg.cn/blog_migrate/7949f4aacf8aab8de80cdebce8886434.jpeg)
na_values可以用一个列表或集合的字符串表示缺失值:
![6fc8c09b5aaf946dd0b4f4f50041722a.png](https://i-blog.csdnimg.cn/blog_migrate/02eaa44e5e5f423bf5270f094b92a20d.jpeg)
字典的各列可以使用不同的NA标记值:
![6b4ab96fbec0c80a5ef4aff630c5091a.png](https://i-blog.csdnimg.cn/blog_migrate/d5f9a6127a2dab83660e331008dfa381.jpeg)
列出了pandas.read_csv和pandas.read_table常用的选项:
![5a25db6cf463d66f21370464a95830ee.png](https://i-blog.csdnimg.cn/blog_migrate/0a660902aacaf50b4c1cf071486a80ef.jpeg)
![92c86d27baff95b796cdbe93e2184522.png](https://i-blog.csdnimg.cn/blog_migrate/a8da62d125fdaab73cceea6d22dc3960.jpeg)
2.逐块读取文本文件
在处理很大的文件时,或找出大文件中的参数集以便于后续处理时,你可能只想读 取文件的一小部分或逐块对文件进行迭代。
在看大文件之前,我们先设置pandas显示地更紧些:
pd.options.display.max_rows = 10
##最大显示行数为10
然后:
![09cfdbd2c387cdac08541a64a09547ba.png](https://i-blog.csdnimg.cn/blog_migrate/538ef3619a51a5a5d7baa326360d9a25.jpeg)
如果只想读取几行(避免读取整个文件),通过nrows进行指定即可:
![6c9ae8e834f325677dbc53f43fe9e94d.png](https://i-blog.csdnimg.cn/blog_migrate/fc02b8d2f258ae6c0b241b53cc1ec08b.jpeg)
要逐块读取文件,可以指定chunksize(行数):
![ae3c73280770009016df2c7ab0bac58f.png](https://i-blog.csdnimg.cn/blog_migrate/03487da2a9e34e201220b0f1b8ffb8c1.png)
read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如说,我们可以迭代处理ex6.csv,将值计数聚合到"key"列中,如下所示:
![637011a5e3b224ebadbb687f0fc4dbe6.png](https://i-blog.csdnimg.cn/blog_migrate/44f6514cfff9f754ddff602a165f550f.jpeg)
3.将数据写出到文本格式
数据也可以被输出为分隔符格式的文本。我们再来看看之前读过的一个CSV文件:
![9da9ee990817919345591465702c95f6.png](https://i-blog.csdnimg.cn/blog_migrate/40d4005806efe9771b57b8eb8619dc10.jpeg)
利用DataFrame的to_csv方法,我们可以将数据写到一个以逗号分隔的文件中:
![7595ea02a0b8a2a5984ec37d0222f536.png](https://i-blog.csdnimg.cn/blog_migrate/a2ecc64680bf893daaa23880d3c7fda8.jpeg)
当然,还可以使用其他分隔符(由于这里直接写出到sys.stdout,所以仅仅是打印出文本结果而已):
![ae615145149fc7190a218317f3f49410.png](https://i-blog.csdnimg.cn/blog_migrate/8995dea517652f5b0c8750c92519f735.jpeg)
缺失值在输出结果中会被表示为空字符串。你可能希望将其表示为别的标记值:
![02bed55be1534946be4bdbcb3eacd3f5.png](https://i-blog.csdnimg.cn/blog_migrate/cb287d228c1d0e27f7ecc36304c27ae7.jpeg)
如果没有设置其他选项,则会写出行和列的标签。当然,它们也都可以被禁用:
![1ba3ddddc295deb5c2308e6d169ce6fc.png](https://i-blog.csdnimg.cn/blog_migrate/3883e65dcaa86b5ab7c32d49fedda81d.png)
此外,你还可以只写出一部分的列,并以你指定的顺序排列:
![1375f11487e5de338a5658f1e066ffca.png](https://i-blog.csdnimg.cn/blog_migrate/e6ff47f1307ef1a5cf4b57604df69d31.png)
Series也有一个to_csv方法:
![3a3503ae41865a54b8c0d8a5de7442b6.png](https://i-blog.csdnimg.cn/blog_migrate/97c4d456df2c8c73f94a47000425f1aa.jpeg)
4.处理分隔符格式
大部分存储在磁盘上的表格型数据都能用pandas.read_table进行加载。然而,有时还是需要做一些手工处理。由于接收到含有畸形行的文件而使read_table出毛病的情况并不少见。为了说明这些基本工具,看看下面这个简单的CSV文件:
![192a5348b349ff4c34c884f6fd1debb1.png](https://i-blog.csdnimg.cn/blog_migrate/948d406657f2e0073390848cedd49698.jpeg)
对于任何单字符分隔符文件,可以直接使用Python内置的csv模块。将任意已打开的文件或文件型的对象传给csv.reader:
![a7b9437ec224c0eb0e9fb403c77977f6.png](https://i-blog.csdnimg.cn/blog_migrate/f93cb262e1af24d7d853db8dbf912498.jpeg)
对这个reader进行迭代将会为每行产生一个元组(并移除了所有的引号):
![62536e5ddfd207f4b5cd679d25b4489c.png](https://i-blog.csdnimg.cn/blog_migrate/b19a0f73b2a784729f514831c1193dea.jpeg)
现在,为了使数据格式合乎要求,你需要对其做一些整理工作。我们一步一步来做。首先,读取文件到一个多行的列表中:
![e07326b30e8c053e63fecfffa3063daa.png](https://i-blog.csdnimg.cn/blog_migrate/69f747e044e6579e9e30803d27ec8d60.jpeg)
然后,我们将这些行分为标题行和数据行:
![03c596dfe8d773009b3b917ce5a21868.png](https://i-blog.csdnimg.cn/blog_migrate/76ed6bd5b9d0f8da25e5c771ffbed424.jpeg)
然后,我们可以用字典构造式和zip(*values),后者将行转置为列,创建数据列的字典:
![9d24609e0ccff098edc2c72b3cd6ffae.png](https://i-blog.csdnimg.cn/blog_migrate/c1a374dade2d1c310ae6c3ded1be27d3.png)
CSV文件的形式有很多。只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符、字符串引用约定、行结束符等):
![be31ad6d8b494ae17010bb4a139e4ae0.png](https://i-blog.csdnimg.cn/blog_migrate/305a3bf804778431c8e4b47fa827a02c.jpeg)