《Python数据科学指南》——1.20 从表格数据使用数组

1.20 从表格数据使用数组

数据科学的应用程序要成功解决一个问题,必须先找到适当的处理数据的方法。例如在机器学习中对数据进行预测或分类,要么采用有监督的方法,要么采用无监督的方法。而在此之前,传输数据,把数据清洗到匹配算法,可能已经花费了很长的时间。

通常,有很多种方法对数据进行整理使之适合数据科学程序进行处理,数据科学程序开发者首先面对的挑战是如何访问数据,并用Python的数据结构让这些数据持续可用。掌握使用Python访问数据的诀窍是非常有用的,能让你避过纷扰,直接面对问题的核心内容。

一般数据是以文本的形式存放的,用逗号或者tab作为分隔符。我们可以采用Python的内置文件对象工具来进行处理。如前所述,文件对象实现了_iter_()和next()方法,这让我们可以处理非常大的文件,这些文件无法一次全部装载到内存里,只能每次读取其中的一小部分。

Python的机器学习库(如scikit-learn)就是基于NumPy库,在这节中,我们将研究如何高效地读取外部数据,并将之转为NumPy的数组以便后续的数据处理。

1.20.1 准备工作

NumPy提供了一个genfromtxt函数可以从表格数据中创建数组,数据存放到NumPy数组中以后,系统处理数据就轻松得多。我们通过一个NumPy 1.8.0编写的代码来看看如何使用genfrom text。

1.20.2 操作方法

我们先从导入必需的库开始,先定义输入的例子,然后演示如何处理表格数据。

# 1.我们先用StringIO来模拟一个小型的表格数据
import numpy as np
from StringIO import StringIO
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")

# 2.使用NumPy的genfromtxt来读取数据,并创建一个NumPy数组
data = np.genfromtxt(in_data,dtype=int,delimiter=",")

# 3.清除掉一些我们不需要的列
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",usecols=(0,1))

# 4.设定列名
in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",names="a,b,c")

# 5.使用列名来处理数据
in_data = StringIO("a,b,c\n10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",names=True)

1.20.3 工作原理

第1步中,我们用StringIO来模拟表格数据,有3个行和3个列,行通过换行表示,列则通过逗号分隔。

第2步中,我们用NumPy的genfromtxt导入数据到NumPy数组。genfromtxt的第一个参数是文件源和文件名,本例中是StringIO对象。输入由逗号分隔,分隔符参数允许我们自己定义分隔符。运行上面的代码后,数据格式如下。

>>> data
array([[10, 20, 30],
        [56, 89, 90],
        [33, 46, 89]])

如你所见,我们成功地将字符串数据加载到了NumPy数组中。

1.20.4 更多内容

下面列出了genfromtxt函数的各个参数以及默认值。

genfromtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None,
skiprows=0, skip_header=0, skip_footer=0, converters=None,
missing='', missing_values=None, filling_values=None, usecols=None,
names=None, excludelist=None, deletechars=None, replace_space='_',
autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None,
usemask=False, loose=True, invalid_raise=True)

唯一必备的参数是数据源的名字,本例中是一个StringIO对象,它可以是一个文件名或者带有read方法的类似于文件的对象,也可以是一个远程文件的URL。

首先必须将给定的行分成列,当文件被打开进行读取时,genfromtxt将非空行切分成一个字符串序列。空行和注释行会被忽略,注释选项帮助gentext判断哪些行是注释行。我们指定的分隔符将字符串切分为列。我们的示例使用“,”作为分隔符。制表符“/t”也是一种常用的分隔符。gentext的默认分隔符是None,这意味着行被空格分成多个列。

一般而言,行被转换成字符串序列之后,列被萃取出来,每个独立的列并没有被清除前导或者后导的空格。在上面示例代码的后面部分,这种情况需要进行处理,特别是有些变量要被作为字典的键。例如,若是前导或后导的空格没有被处理完全,代码可能会出现bug或错误。设置参数autostrip=True有助于避免这类问题。

很多情况下,我们在读取文件的时候要跳过一些数据,比如跳过最前n行或者最后n行,这就需要使用headers和footers参数。设置skip_header=n会在读文件时跳过最开始的n行。类似地,设置skip_footer=n则跳过最后的n行。

和不需要的行类似,有时我们需要跳过一些列,usecols参数可以指定一个包含所需要的列的列表。

in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",usecols=(0,1))

在上面的示例中,我们只选择了两个列,第0和第1列。数据对象形式如下。

>>> data
array([[10, 20],
        [56, 89],
        [33, 46]])

使用names参数,我们可以自定义列名,由逗号分隔的列名字符串参数形式如下。

in_data = StringIO("10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",names="a,b,c")
>>> data
array([(10, 20, 30), (56, 89, 90), (33, 46, 89)],
       dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<i4')])

设定names参数为真,输入文件的第1行会被当成列名。

in_data = StringIO("a,b,c\n10,20,30\n56,89,90\n33,46,89")
data = np.genfromtxt(in_data,dtype=int,delimiter=",",names=True)

>>> data
array([(10, 20, 30), (56, 89, 90), (33, 46, 89)],
       dtype=[('a', '<i4'), ('b', '<i4'), ('c', '<i4')])

NumPy里还有个叫作loadtxt的方法可以方便地从文本文件中创建NumPy数组,请参阅:http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html。

这个函数比genfromtxt要简单一些,如果你不需要复杂的数据处理架构,比如处理丢失的数据等情况,你可以选用loadtxt。

此外,如果你不需要装载数据到NumPy数组,只想把数据加载到列表中,Python默认提供了csv库,可以参考下面的URL。

https://docs.python.org/2/library/csv.html.

上面这个csv库里有一个有趣的方法叫作csv.Sniffer.sniff()。要处理一个很大的csv文件时,我们要理解它的结构,就可以使用sniff()函数,它返回一个具有csv文件大部分属性的子类。

时间: 2024-11-03 03:03:23

《Python数据科学指南》——1.20 从表格数据使用数组的相关文章

《Python数据科学指南》——导读

前 言 如今,我们生活在一个万物互联的世界,每天都在产生海量数据,不可能依靠人力去分析产生的所有数据并做出决策.人类的决策越来越多地被计算机辅助决策所取代,这也得益于数据科学的发展.数据科学已经深入到我们互联世界中的每个角落,市场对那些十分了解数据科学算法并且有能力用这些算法进行编程的人才需求是不断增长的.数据科学是多领域交叉的,简单列举几个:数据挖掘.机器学习.统计学等.这对那些渴望成为数据科学家以及已经从事这一领域的人们在各方面都倍感压力.把算法当成黑盒子应用到决策系统里,可能会适得其反.面

《Python数据科学指南》——第1章 Python在数据科学中的应用 1.1 简介

第1章 Python在数据科学中的应用 在这一章里,我们将探讨以下主题. 使用字典对象 使用字典的字典 使用元组 使用集合 写一个列表 从另一个列表创建列表--列表推导 使用迭代器 生成一个迭代器和生成器 使用可迭代对象 将函数作为变量传递 在函数中嵌入函数 将函数作为参数传递 返回一个函数 使用装饰器改变函数行为 使用lambda创造匿名函数 使用映射函数 使用过滤器 使用zip和izip函数 从表格数据使用数组 对列进行预处理 列表排序 采用键排序 使用itertools 1.1 简介 Py

《Python数据科学指南》——1.2 使用字典对象

1.2 使用字典对象 在Python语言中,容器是一种对象,它能够容纳任意数量.任意类型的对象.它可以对子对象进行操作,还可以迭代操作.字典.元组.列表还有集合都是容器对象.在collections模块中,Python提供了更多的容器类型.在这一节中,我们先来仔细了解字典. 1.2.1 准备工作 我们先通过一个Python的脚本示例来理解字典是如何操作的,这段脚本用来统计词频,也就是每个词在给定的文本中出现的次数. 1.2.2 操作方法 下面的示例演示了在Python中对字典对象如何操作.通过对

《Python数据科学指南》——1.4 使用元组

1.4 使用元组 在Python中,元组是一种顺序型的容器对象.元组是不可变的,元组中的元素由逗号分隔开,可以对不同类别构成的对象进行排序,不允许插入操作,支持以下操作. in和not in. 比较.串联.切片和索引.min ()和max (). 1.4.1 准备工作 我们讲解字典的时候,描述了完整的功能,对于元组,我们通过一些小段的代码来聚焦于元组的创建与维护操作. 1.4.2 操作方法 先让我们看看一些元组创建和维护的示例代码. # 1.创建一个元组 a_tuple = (1,2,'a')

《Python数据科学指南》——1.3 使用字典的字典

1.3 使用字典的字典 我们之前提到,为了完成目标,你得创造性地应用各类数据结构,这样才能发挥它们的威力.接下来,我们通过一个实例来帮助理解"字典的字典". 1.3.1 准备工作 请看表1-1. 第1列中列出了3个用户,其他列都是电影,单元格里是每个用户给电影的评分.我们要把这些数据放到内存中,这样大型程序的其他部分也能方便地访问,此时我们将使用"字典的字典". 1.3.2 操作方法 我们通过匿名函数来创建一个user_movie_rating的字典对象,以此展示&

《Python数据科学指南》——1.8 使用迭代器

1.8 使用迭代器 毫无疑问,对于数据科学的程序而言,数据是极其重要的输入.数据的大小是可变的,有些能装载到内存中,有些则不能.而记录访问架构也是随一种数据格式到另一种而变化.有趣的是,不同的算法处理数据时,需要的是可变长度的组块.例如,假如你在写一个随机梯度下降的算法,你希望在每个时间片传送5000条记录的数据块,如果你对如何访问数据.理解数据格式.依次传送数据.给调用者需要的数据等流程有着清晰的概念,那你才能成功.这样能让你写出清晰的代码.大多数时候,最有趣的部分是我们如何处理数据,而不是我

《Python数据科学指南》——1.10 使用可迭代对象

1.10 使用可迭代对象 可迭代对象和生成器十分相似,但是有一个重要的区别:我们可以重复地访问一个可迭代对象,即使我们已经访问完了序列中的所有元素,我们还可以从头重新访问它,这和生成器是完全不同的. 如果不保持任何状态,它们就是基于对象的生成器.所有带有iter方法的类,在用来产生数据时,都可以被作为无状态对象生成器来使用. 1.10.1 准备工作 我们通过一个简单的示例来理解可迭代对象.如果理解了之前介绍的生成器和迭代器,你也能很容易地理解这个概念. 1.10.2 操作方法 我们来创建一个简单

《Python数据科学指南》——1.19 使用zip和izip函数

1.19 使用zip和izip函数 zip函数将两个相同长度的集合合并成对,它是Python的内置函数. 1.19.1 准备工作 我们通过一个简单示例来演示zip函数. 1.19.2 操作方法 我们传递两个序列给zip函数,并打印输出. print zip(range(1,5),range(1,5)) 1.19.3 工作原理 本例中zip函数的两个参数是两个列表,这两个列表都是由从1到5的数值组成.range函数有3个参数:起始数值.结束数值和步长,默认步长为1.本例中,我们分别把1和5作为列表

《Python机器学习实践指南》——1.1 数据科学/机器学习的工作流程

1.1 数据科学/机器学习的工作流程 打造机器学习的应用程序,与标准的工程范例在许多方面都是类似的,不过有一个非常重要的方法有所不同:需要将数据作为原材料来处理.数据项目成功与否,很大程度上依赖于你所获数据的质量,以及它是如何被处理的.由于数据的使用属于数据科学的领域,理解数据科学的工作流程对于我们也有所帮助:整个过程要按照图1-1中的顺序,完成六个步骤:获取,检查和探索,清理和准备,建模,评估和最后的部署. 在这个过程中,还经常需要绕回到之前的步骤,例如检查和准备数据,或者是评估和建模,但图1