dataframe 如何选中某列的一行_机器学习Web应用:如何理解pandas模块?

Python的pandas模块功能强大,包含大量用于分析数据结构的函数。它依赖于NumPy库。pandas的设计初衷是降低数据分析操作的难度,提升速度。比起Python的标准函数, pandas函数性能更高,尤其擅长文件读写、数据库操作; pandas是数据处理的最佳选择。探索数据所包含的信息,主要方法有哪些以及如何用pandas进行操作,下面几节将给出答案。我们先讲解数据在pandas中的存储形式和数据的加载方法。

import pandas as pd

1·探索数据

我们先介绍pandas只有一维的数组类对象Series ,以此引入pandas的数据库结构DataFrame, Series可以存储NumPy所有类型的数据,同时还存储数据的标签-索引。我们来看一个简单的例子:

f910f962d62528e6487f152c1dd8f4a7.png

obj对象由两类值组成,右侧为元素,左侧为元素对应的索引。给定元素数组的长度为N,索引则默认从0排到N-1. Series的元素数组和索引对象,可分别用values和index属性获取:

b126270ef7cf2e0352486900b488b250.png

NumPy数组运算,索引会予以保留(例如标量乘法、用布尔数组过滤或用数学函数处理数组):

b4d60201e29395482eb0b06f9887f1ca.png

Python字典可转换为series对象,但是字典的键被转换为索引:

596ee84fafa51054a7f87b1fdb441b17.png

也可以用单独的列表作为索引:

273734168b10fc5ffb27a1d95a19a95b.png

上述例子,最后一个索引g ,没有对应的元素,因此pandas默认插入NaN ( Not a Number ,非数字)。我们用缺失值或NAN来指代缺失的数据。用pandas的isnull和notnull函数,可找出缺失值:

b14553960cca06355c5aebcfde0e5ed1.png

现在,我们可以从一个CSV文件导入数据到DataFrame结构。DataFrame这种数据结构,有一组按顺序排列的列,每一列可以是不同的数据类型(数值、字符串、布尔值等), DataFrame有两种索引(行、列索引)。我们也可以将DataFrame看成一个由Series对象组成的字典,每个Series里面,所有元素的索引相同(列的标题)。下面我们结合ad.data文件中的数据进行讲解,该数据可从

http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements下载。在前面机器学习的例子已介绍过。

在终端输入以下代码导入数据(该例中,数据文件的路径为data_example/ad-dataset/ad. data) :

In [4]: data =pd.read_csv("data_example/ad-dataset/ad.data", header=None)

该文件没有标题行(故将header参数设置为none ) ,因此使用数字作为各列的名称。在data对象上调用describe函数,可得到DataFrame的各种总描述性统计信息:

6cda5a64decbac597ecb9d9cbb36b9e4.png

上面总结了几种定量信息。由此可见,该数据集总共有1554个数值类型的列(因为没有标题行,列的名称用数字表示)、3279行(对每一列调用count函数)。每一列都有一组统计指标(均值、标准差、最小值、最大值和分位数) ,这些统计数据有助于我们对DataFrame中数据的定量信息做出初步估计。

用columns属性可获取到所有列的名称:

a04c38161f2f68b279e300a3ad96431d.png

所有列的名称为int64类型,下述命令返回所有列的实际数据类型:

2fe36d064b808ce22ae6ef7860021ff2.png

前4列和标签列(最后1例)为object类型,其余为int64类型。列的访问方法有两种。第1种,指定列的名称,与指定字典的键相似:

0b473f4be227b23d41b67dceaa3a62b4.png

用列表形式,指定多个列名称,可获取到多列:

f1425af43912cb2d4f39b6f86f098e98.png

另一种访问列的方法是点号句法,这只有在列名称也是Python变量(中间没有空格) ,没有重名的DataFrame属性或函数(比如count或sum ) ,并且列名称还必须是字符串类型时,才能使用该方法(该例中,列名称为int64类型,因此不能用此方法)。

若想对DataFrame中的内容有一个大致的了解,可使用head()函数。它默认返回一列的前5个元素(或DataFrame的前5行) :

37a9fb7e28ed5b30171462fdfa2a9e31.png

当然也可以用tail()函数,它默认返回最后5个元素或5行。在head()或tail()函数中指定数字n,将返回所选列的前、后n个元素:

c01c5e63b2ee94081ee1479b165885a7.png

用python的标准切片句法,也可以从DateFrame中获取到一定数量的行:

795d5e2aba0161f10ebf6cf5992621ba.png

上述代码仅获取到DateFrame的前两行(当然还有标题)。

2. 操作数据

行的选取方法有多种,比如指定索引或按条件选取:

834e73333bb523913b7613efe5f3d36d.png

或者,按多个条件选取数据:

3a879944f9998097c417e411d81f5ddc.png

上面返回的数据为特征1大于0且包含广告的网页。

Ix方法通过指定索引来选择相应的行:

774d3c7a9d11c150e858688b62804e14.png

此外,也可以使用iloc函数:

8d5f9ee84ec649f748b483e72eb231f7.png

ix和iloc的不同点在于,操作的是索引列标签的名称,而iloc操作的是索引的位置(因此它只能接收整数)。因此,上述例子, ix一直找到标签3出现为止(共4行) ,而iloc函数返回DatarFrame的前3行。访问DataFrame内部数据,还有一个函数叫作loc ,它查找索引列的标签名,返回相应的行,例如:

f7a87562dcdda458c39a60964a529b34.png

注意该函数与Python的标准切片方法不同,因为结果包括起始和结束位置的行(该例中,输出结果包含索引为3的行)

再来看其他操作。DataFrame对象的一整列可设置为同一个值:

ad6c71f34f5d0844e1492dbe5824d77e.png

也可以将指定的单元格设置为我们想要的值:

791d170202dbb16e5bc7e43db22ed802.png

或将整行设置为一组值(该例使用随机数0或1和ad.标签)。

c2cd5d0e0cec3ad614f6b83ae00e830f.png

数组转换为series对象后,可作为新的一行追加到DatarFrame的末尾:

b9351b335380e79d42273f09645e359e.png

用loc函数可在DatarFrame最后增加一行:

dece221d046c22c762fac364cb8955ed.png

追加列则非常简单,将元素赋给DatarFrame新的列即可:

9cce65367c44b046a26752f6c12b2391.png

上述例子,新增的列所有元素的值为test value。删除列,可用drop函数:

f9eba46ea090fa1dfba32ff588c4fa84.png

出于多种原因,数据集也许包含重复数据。Pandas的duplicated方法可判断每一行是否是对其他行的重复:

d68d9f7c90c163e192b33c748f67ea71.png

Drop_duplicates函数比duplicated函数更强大,它返回的DataFrame仅包含去重过后剩余的所有元素。例如,使用该函数,我们可以找出标签这一列两个不同的元素是:

5b78df7d831a354cb477e56eae009b1f.png

我们还可以方便地将上述结果转换为列表:

f2f5c136540644fc7bcdd7ef89c98394.png

我们可以把标签转换为数值,前面机器学习示例一节讲过这种方法:

af8ebd3fa493ec8f4f2d5ca75a775612.png

标签列仍然为object类型:

1e7a5d2bb9df80584942b75c5a269f65.png

然后,我们可以将标签列转换为浮点型:

f54e45a62220e8bfed2faba4f88e1326.png

前4列包含不同类型的数据(字符串、?和浮点型数字)。我们删除字符串类型的元素后,才能将各列元素转换为数值型。我们可以用replace函数将所有的?实例(缺失值)替换为NaN :

4ce1bb2ed802a3675a7d7a2978afadef.png

现在,我们可以用两种方法处理包含缺失值的行。方法一,用dropna方法直接删除包含缺失值的行:

f44c8de38afdd69c3efb04ac9266adec.png

方法二,包含缺失数据的行,除了直接将其删除(可能删除重要信息)外,也可为其填充数据。用fillina方法,向这些空的单元格填充一个常量,可满足大多数需求:

209adb7087745127a120afb9ecd63135.png

经过以上处理,所有列的各元素均为数值型,因此可用astype函数将其设置为float型。此外,我们还可以用lambda函数,将DataFrame的每一列转换为数值类型:

0e4ebbf5e5fae741a5b7a7d216a4c677.png

上述代码,每个x实例表示一列, to_numeric函数将每一类的元素转换为最相近的数据类型(该例为float ).

pandas教程的最后,我们想演示下如何拼接两个DataFrame对象,因为在真实应用场景,可能会用到这项操作。我们随机选取元素,再创建一个小型的DataFrame :

fb5a8dc1525f2782052edd5f374f7ec9.png

上述代码生成一个包括两行数据的新表格。我们可以用concat函数,将其合并到原DataFrame中,将data1的各行拼接到data的下面:

8a51b7fc85b248ad79cefb9c6c349162.png

执行上述操作后,我们会发现datatot比data增加了两行(注意data的行数与刚开始的不同,因为我们后来删除了它含有NanN元素的行)。

本文节选自《机器学习Web应用》

87eeb35a9d29545e616d7070d6bf0498.png

这是一本结合Python语言讲述Web下机器学习的图书,本书内容全面,既能够让读者熟悉最基本的机器学习的相关概念,也能够了解Web下数据挖掘的工具和技术,除此之外,书中还会介绍与Django框架有关的知识以及数据库管理等内容,帮助读者掌握聚类和分类技术并用Python实现它们。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值