加载数据字段内容中有分隔符_数据加载、存储与文件格式(一)

前言

访问数据是使用本书所介绍的这些工具的第一步。输入输出通常可以划分为几个大类:读取文本文件其他更高效的磁盘存储格式 加载数据库中的数据利用Web API操作网络资源。

一、读写文本格式的数据

pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。表6-1对它们进行了总结,其中read_csvread_table可能会是你今后用得最多的。

e231c79187ae98fc8e4cd43f48066288.png

我将大致介绍一下这些函数在将文本数据转换为DataFrame时所用到的一些技术。 这些函数的选项可以划分为以下几个大类:

  1. 索引:将一个或多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名
  2. 类型推断和数据转换:包括用户定义值的转换、和自定义的缺失值标记列表等。
  3. 日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列
  4. 不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据)。

1.对(CSV)文本文件的操作

对文本的一些基本操作:

我们可以使用read_csv将其读入一个DataFrame,

还可以使用read_table,并指定分隔符:

4ea74410d0cbe7c626435dea1e9e8063.png

并不是所有文件都有标题行。这时候可以让pandas为其分配默认的列名,也可以自定义列名。

分配默认的列名:

4fe70580a49152eec08be3ef34553003.png

自定义列名:

135079ee55bdef900d69fd840b731087.png

但是,要注意一件事,但文件没有标题行时,如果不标注header=None,则会默认的将第一行标注为标题行,我们可以看一个实例,和加了header=None时对比:

41bd8f64c5dc060750022e1b2294f9ef.png

如果你希望将message列做成DataFrame的索引。你可以明确表示要将该列放到索引4的位置上,也可以通过index_col参数指定"message":

367866d02a7dd069c3c7762a904cfbac.png

注:index_col=‘参数’,表示对行的索引进行修改。

如果希望将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表即可:

5691f205d479afea12bfd56b5db0b001.png

有些情况下,有些表格可能不是用固定的分隔符去分隔字段的(比如空白符或其它 模式)。看看下面这个文本文件:

d00a352b36c2a4a4ea7f57e3e092fd80.png

虽然可以手动对数据进行规整,这里的字段是被数量不同的空白字符间隔开的。这种情况下,你可以传递一个正则表达式作为read_table的分隔符。可以用正则表达式表达为s+,于是有:

1b339eee2cf8b82e0d359a33208e7047.png
这里,由于列名比数据行的数量少,所以read_table推断第一列应该是DataFrame 的索引。

对于一些你想要跳过的文件某些行里的文字和其他内容,可以使用skiprows=[+行数]

8891989362b312106ca7fef5e32d314e.png

处理缺失值:

缺失值处理是文件解析任务中的一个重要组成部分。缺失数据经常是要么没有(空字符串),要么用某个标记值表示。默认情况下,pandas会用一组经常出现的标记值进行识别,比如NA及NULL:

9beb466aef44ecf32f860bb0aea6f00d.png

na_values可以用一个列表或集合的字符串表示缺失值:

6fc8c09b5aaf946dd0b4f4f50041722a.png

字典的各列可以使用不同的NA标记值:

6b4ab96fbec0c80a5ef4aff630c5091a.png

列出了pandas.read_csv和pandas.read_table常用的选项:

5a25db6cf463d66f21370464a95830ee.png

92c86d27baff95b796cdbe93e2184522.png

2.逐块读取文本文件

在处理很大的文件时,或找出大文件中的参数集以便于后续处理时,你可能只想读 取文件的一小部分或逐块对文件进行迭代。

在看大文件之前,我们先设置pandas显示地更紧些:

pd.options.display.max_rows = 10
##最大显示行数为10

然后:

09cfdbd2c387cdac08541a64a09547ba.png

如果只想读取几行(避免读取整个文件),通过nrows进行指定即可:

6c9ae8e834f325677dbc53f43fe9e94d.png

要逐块读取文件,可以指定chunksize(行数):

ae3c73280770009016df2c7ab0bac58f.png

read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代。比如说,我们可以迭代处理ex6.csv,将值计数聚合到"key"列中,如下所示:

637011a5e3b224ebadbb687f0fc4dbe6.png

3.将数据写出到文本格式

数据也可以被输出为分隔符格式的文本。我们再来看看之前读过的一个CSV文件:

9da9ee990817919345591465702c95f6.png

利用DataFrame的to_csv方法,我们可以将数据写到一个以逗号分隔的文件中:

7595ea02a0b8a2a5984ec37d0222f536.png

当然,还可以使用其他分隔符(由于这里直接写出到sys.stdout,所以仅仅是打印出文本结果而已):

ae615145149fc7190a218317f3f49410.png

缺失值在输出结果中会被表示为空字符串。你可能希望将其表示为别的标记值:

02bed55be1534946be4bdbcb3eacd3f5.png

如果没有设置其他选项,则会写出行和列的标签。当然,它们也都可以被禁用:

1ba3ddddc295deb5c2308e6d169ce6fc.png

此外,你还可以只写出一部分的列,并以你指定的顺序排列:

1375f11487e5de338a5658f1e066ffca.png

Series也有一个to_csv方法:

3a3503ae41865a54b8c0d8a5de7442b6.png

4.处理分隔符格式

大部分存储在磁盘上的表格型数据都能用pandas.read_table进行加载。然而,有时还是需要做一些手工处理。由于接收到含有畸形行的文件而使read_table出毛病的情况并不少见。为了说明这些基本工具,看看下面这个简单的CSV文件:

192a5348b349ff4c34c884f6fd1debb1.png

对于任何单字符分隔符文件,可以直接使用Python内置的csv模块。将任意已打开的文件或文件型的对象传给csv.reader:

a7b9437ec224c0eb0e9fb403c77977f6.png

对这个reader进行迭代将会为每行产生一个元组(并移除了所有的引号):

62536e5ddfd207f4b5cd679d25b4489c.png

现在,为了使数据格式合乎要求,你需要对其做一些整理工作。我们一步一步来做。首先,读取文件到一个多行的列表中:

e07326b30e8c053e63fecfffa3063daa.png

然后,我们将这些行分为标题行和数据行:

03c596dfe8d773009b3b917ce5a21868.png

然后,我们可以用字典构造式和zip(*values),后者将行转置为列,创建数据列的字典:

9d24609e0ccff098edc2c72b3cd6ffae.png

CSV文件的形式有很多。只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符、字符串引用约定、行结束符等):

be31ad6d8b494ae17010bb4a139e4ae0.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值