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

简介:

本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.20节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

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文件大部分属性的子类。

相关文章
|
21天前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
401 1
|
22天前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
221 1
|
22天前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
229 0
|
14天前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
23天前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
2月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
2月前
|
数据采集 数据可视化 关系型数据库
基于python大数据的电影数据可视化分析系统
电影分析与可视化平台顺应电影产业数字化趋势,整合大数据处理、人工智能与Web技术,实现电影数据的采集、分析与可视化展示。平台支持票房、评分、观众行为等多维度分析,助力行业洞察与决策,同时提供互动界面,增强观众对电影文化的理解。技术上依托Python、MySQL、Flask、HTML等构建,融合数据采集与AI分析,提升电影行业的数据应用能力。
|
存储 索引 Python
leetcode-350:两个数组的交集 II(python中Counter的用法,海象运算符:=)
leetcode-350:两个数组的交集 II(python中Counter的用法,海象运算符:=)
145 0
|
存储 JavaScript 前端开发
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
92 1

推荐镜像

更多
下一篇
开通oss服务