数据分析三剑客之Pandas

1.引入

前面一篇文章我们介绍了numpy,但numpy的特长并不是在于数据处理,而是在它能非常方便地实现科学计算,所以我们日常对数据进行处理时用的numpy情况并不是很多,我们需要处理的数据一般都是带有列标签和index索引的,而numpy并不支持这些,这时我们就需要pandas上场啦! 

2.WHAT?

Pandas是基于Numpy构建的库,在数据处理方面可以把它理解为numpy加强版,同时Pandas也是一项开源项目 。不同于numpy的是,pandas拥有种数据结构:SeriesDataFrame: 

下面我们就来生成一个简单的series对象来方便理解:

In [1]: from pandas import Series,DataFrame
In [2]: import pandas as pd
In [3]: data = Series([1,2,3,4],index = ['a','b','c','d'])
In [4]: data
Out[4]:
a    1
b    2
c    3
d    4
dtype: int64

Series是一种类似一维数组的数据结构,由一组数据和与之相关的index组成,这个结构一看似乎与dict字典差不多,我们知道字典是一种无序的数据结构,而pandas中的Series的数据结构不一样,它相当于定长有序的字典,并且它的index和value之间是独立的,两者的索引还是有区别的,Series的index变的,而dict字典的key值是不可变的。

下面照例生成一个简单的DataFrame对象:

In [8]: data = {'a':[1,2,3],'b':['we','you','they'],'c':['btc','eos','ae']}
In [9]: df = DataFrame(data)
In [10]: df
Out[10]:a     b    c
0  1    we  btc
1  2   you  eos
2  3  they   ae

DataFrame这种数据结构我们可以把它看作是一张二维表,DataFrame长得跟我们平时使用的Excel表格差不多,DataFrame的横行称为columns,竖列和Series一样称为index,DataFrame每一列可以是不同类型的值集合,所以DataFrame你也可以把它视为不同数据类型同一index的Series集合。

3.WHY?

科学计算方面numpy是优势,但在数据处理方面DataFrame就更胜一筹了,事实上DataFrame已经覆盖了一部分的数据操作了,对于数据挖掘来说,工作可大概分为读取数据-数据清洗-分析建模-结果展示:

先说说读取数据,Pandas提供强大的IO读取工具,csv格式、Excel文件、数据库等都可以非常简便地读取,对于大数据,pandas也支持大文件的分块读取;

接下来就是数据清洗,面对数据集,我们遇到最多的情况就是存在缺失值,Pandas把各种类型数据类型的缺失值统一称为NaN(这里要多说几句,None==None这个结果是true,但np.nan==np.nan这个结果是false,NaN在官方文档中定义的是float类型,有关于NaN和None的区别以及使用,有位博主已经做好整理:None vs NaN),Pandas提供许多方便快捷的方法来处理这些缺失值NaN。

最重要的分析建模阶段,Pandas自动且明确的数据对齐特性,非常方便地使新的对象可以正确地与一组标签对齐,有了这个特性,Pandas就可以非常方便地将数据集进行拆分-重组操作。

最后就是结果展示阶段了,我们都知道Matplotlib是个数据视图化的好工具,Pandas与Matplotlib搭配,不用复杂的代码,就可以生成多种多样的数据视图。

4.HOW?

Series

Series的两种生成方式:

In [19]: data = Series([222,'btc',234,'eos'])
In [20]: data
Out[20]:
0    222
1    btc
2    234
3    eos
dtype: object

虽然我们在生成的时候没有设置index值,但Series还是会自动帮我们生成index,这种方式生成的Series结构跟list列表差不多,可以把这种形式的Series理解为竖起来的list列表。

In [21]: data = Series([1,2,3,4],index = ['a','b','c','d'])
In [22]: data
Out[22]:
a    1
b    2
c    3
d    4
dtype: int64

这种形式的Series可以理解为numpy的array外面披了一件index的马甲,所以array的相关操作,Series同样也是支持的。结构非常相似的dict字典同样也是可以转化为Series格式的:

In [29]: dic = {'a':1,'b':2,'c':'as'}
In [30]: dicSeries = Series(dic)

查看Series的相关信息:

In [32]: data.index
Out[32]: Index(['a', 'b', 'c', 'd'], dtype='object')In [33]: data.values
Out[33]: array([1, 2, 3, 4], dtype=int64)In [35]: 'a' in data    #in方法默认判断的是index值
Out[35]: True

Series的NaN生成:

In [46]: index1 = [ 'a','b','c','d']
In [47]: dic = {'b':1,'c':1,'d':1}
In [48]: data2 = Series(dic,index=index1)
In [49]: data2
Out[49]:
a    NaN
b    1.0
c    1.0
d    1.0
dtype: float64

从这里我们可以看出Series的生成依据的是index值,index‘a’在字典dic的key中并不存在,Series自然也找不到’a’的对应value值,这种情况下Pandas就会自动生成NaN(not a number)来填补缺失值,这里还有个有趣的现象,原本dtype是int类型,生成NaN后就变成了float类型了,因为NaN的官方定义就是float类型

NaN的相关查询:

In [58]: data2.isnull()
Out[58]:
a     True
b    False
c    False
d    False
dtype: boolIn [59]: data2.notnull()
Out[59]:
a    False
b     True
c     True
d     True
dtype: boolIn [60]: data2[data2.isnull()==True]    #嵌套查询NaN
Out[60]:
a   NaN
dtype: float64In [64]: data2.count()    #统计非NaN个数
Out[64]: 3

切记切记,查询NaN值切记不要使用np.nan==np.nan这种形式来作为判断条件,结果永远是False,==是用作值判断的,而NaN并没有值,如果你不想使用上方的判断方法,你可以使用is作为判断方法,is对象引用判断,np.nan is np.nan,结果就是你要的True。

Series自动对齐:

In [72]: data1
Out[72]:
a      1
asd    1
b      1
dtype: int64In [73]: data
Out[73]:
a    1
b    2
c    3
d    4
dtype: int64In [74]: data+data1
Out[74]:
a      2.0
asd    NaN
b      3.0
c      NaN
d      NaN
dtype: float64

从上面两个Series中不难看出各自的index所处位置并不完全相同,这时Series的自动对齐特性就发挥作用了,在算术运算中,Series会自动寻找匹配的index值进行运算,如果index不存在匹配则自动赋予NaN,值得注意的是,任何数+NaN=NaN,你可以把NaN理解为吸收一切的黑洞。

Series的name属性:

In [84]: data.index.name = 'abc'
In [85]: data.name = 'test'
In [86]: data
Out[86]:
abc
a    1
b    2
c    3
d    4
Name: test, dtype: int64

Series对象本身及其索引index都有一个name属性,name属性主要发挥作用是在DataFrame中,当我们把一个Series对象放进DataFrame中,新的列将根据我们的name属性对该列进行命名,如果我们没有给Series命名,DataFrame则会自动帮我们命名为0

5.DataFrame

DataFrame的生成:

In [87]:  data = {'name': ['BTC', 'ETH', 'EOS'], 'price':[50000, 4000, 150]}
In [88]: data = DataFrame(data)
In [89]: data
Out[89]:name  price
0  BTC  50000
1  ETH   4000
2  EOS    150

DataFrame的生成与Series差不多,你可以自己指定index,也可不指定,DataFrame会自动帮你补上。

查看DataFrame的相关信息:

In [95]: data.index
Out[95]: RangeIndex(start=0, stop=3, step=1)In [96]: data.values
Out[96]:
array([['BTC', 50000],['ETH', 4000],['EOS', 150]], dtype=object)In [97]: data.columns    #DataFrame的列标签
Out[97]: Index(['name', 'price'], dtype='object')

DataFrame的索引:

In [92]: data.name
Out[92]:
0    BTC
1    ETH
2    EOS
Name: name, dtype: objectIn [93]: data['name']
Out[93]:
0    BTC
1    ETH
2    EOS
Name: name, dtype: objectIn [94]: data.iloc[1]    #loc['name']查询的是行标签
Out[94]:
name      ETH
price    4000
Name: 1, dtype: object

其实行索引,除了iloc,loc还有个ixix既可以进行行标签索引,也可以进行行号索引,但这也大大增加了它的不确定性,有时会出现一些奇怪的问题,所以pandas在0.20.0版本的时候就把ix给弃用了。

6.DataFrame的常用操作

简单地增加行、列:

In [105]: data['type'] = 'token'    #增加列In [106]: data
Out[106]:name  price   type
0  BTC  50000  token
1  ETH   4000  token
2  EOS    150  token
In [109]: data.loc['3'] = ['ae',200,'token']    #增加行In [110]: data
Out[110]:name  price   type
0  BTC  50000  token
1  ETH   4000  token
2  EOS    150  token
3   ae    200  token

删除行、列操作:

In [117]: del data['type']    #删除列In [118]: data
Out[118]:name  price
0  BTC  50000
1  ETH   4000
2  EOS    150
3   ae    200
In [120]: data.drop([2])    #删除行
Out[120]:name  price
0  BTC  50000
1  ETH   4000
3   ae    200In [121]: data
Out[121]:name  price
0  BTC  50000
1  ETH   4000
2  EOS    150
3   ae    200

这里需要注意的是,使用drop()方法返回的是Copy而不是视图,要想真正在原数据里删除行,就要设置inplace=True

In [125]: data.drop([2],inplace=True)In [126]: data
Out[126]:name  price
0  BTC  50000
1  ETH   4000
3   ae    200

设置某一列为index:

In [131]: data.set_index(['name'],inplace=True)In [132]: data
Out[132]:price
name
BTC   50000
ETH    4000
ae      200In [133]: data.reset_index(inplace=True)    #将index返回回dataframe中In [134]: data
Out[134]:name  price
0  BTC  50000
1  ETH   4000
2   ae    200

处理缺失值:

In [149]: data
Out[149]:name    price
0  BTC  50000.0
1  ETH   4000.0
2   ae    200.0
3  eos      NaNIn [150]: data.dropna()    #丢弃含有缺失值的行
Out[150]:name    price
0  BTC  50000.0
1  ETH   4000.0
2   ae    200.0In [151]: data.fillna(0)    #填充缺失值数据为0
Out[151]:name    price
0  BTC  50000.0
1  ETH   4000.0
2   ae    200.0
3  eos      0.0

还是需要注意:这些方法返回的是copy而不是视图,如果想在原数据上改变,别忘了inplace=True

数据合并:

In [160]: data
Out[160]:name    price
0  BTC  50000.0
1  ETH   4000.0
2   ae    200.0
3  eos      NaNIn [161]: data1
Out[161]:name  other
0  BTC  50000
1  BTC   4000
2  EOS    150In [162]: pd.merge(data,data1,on='name',how='left')    #以name为key进行左连接
Out[162]:name    price    other
0  BTC  50000.0  50000.0
1  BTC  50000.0   4000.0
2  ETH   4000.0      NaN
3   ae    200.0      NaN
4  eos      NaN      NaN

平时进行数据合并操作,更多的会出一种情况,那就是出现重复值,DataFrame也为我们提供了简便的方法:

data.drop_duplicates(inplace=True)

数据的简单保存与读取:

In [165]: data.to_csv('test.csv')In [166]: pd.read_csv('test.csv')
Out[166]:Unnamed: 0 name    price
0           0  BTC  50000.0
1           1  ETH   4000.0
2           2   ae    200.0
3           3  eos      NaN

为什么会出现这种情况呢,从头看到尾的同学可能就看出来了,增加第三行时,我用的是loc[‘3’]行标签来增加的,而read_csv方法是默认index是从0开始增长的,此时只需要我们设置下index参数就ok了:

In [167]: data.to_csv('test.csv',index=None)    #不保存行索引
In [168]: pd.read_csv('test.csv')
Out[168]:name    price
0  BTC  50000.0
1  ETH   4000.0
2   ae    200.0
3  eos      NaN

其他的还有header参数, 这些参数都是我们在保存数据时需要注意的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/131887.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PHY】3GPP UE能力类别的变化

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

I2C总线协议

什么是I2C I2C(Inter-Integrated Circuit),也可以叫IIC、I2C,译作集成电路总线,是两线式串行通信总线,用于设备间的通讯等,标准情况下最高传送速率达100Kbps。顾名思义,I2C通讯只需…

【Redis】Redis实现分布式锁

【Redis】Redis常见面试题(1) 文章目录 【Redis】Redis常见面试题(1)1. 为什么要用分布式锁2. Redis如何实现分布式锁3. Redis接受多个请求模拟演示4. 使用Redis实现分布式锁会存在什么问题4.1 一个锁被长时间占用4.2 锁误删 【Re…

记录vite下使用require报错和解决办法

前情提要 我们现在项目用的是vite4react18开发的项目、但是最近公司有个睿智的人让我把webpack中的bpmn组件迁移过来、结果就出现问题啦:因为webpack是commonjs规范、但是vite不是、好像是es吧、可想而知各种报错 废话不多说啦 直接上代码: 注释是之前c…

CopyOnWriteArrayList源码分析

其中唯一的线程安全 List 实现就是 CopyOnWriteArrayList。 特点 由于读取操作不会对原有数据进行修改,因此,对于每次读取都进行加锁其实是一种资源浪费。相比之下,我们应该允许多个线程同时访问 List 的内部数据,毕竟对于读取操…

(二十八)大数据实战——Flume数据采集之kafka数据生产与消费集成案例

前言 本节内容我们主要介绍一下flume数据采集和kafka消息中间键的整合。通过flume监听nc端口的数据,将数据发送到kafka消息的first主题中,然后在通过flume消费kafka中的主题消息,将消费到的消息打印到控制台上。集成使用flume作为kafka的生产…

JAVA设计模式8:装饰模式,动态地将责任附加到对象上,扩展对象的功能

作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。 目录 一、什么是装饰模式二、…

春秋云镜 CVE-2015-1427

春秋云镜 CVE-2015-1427 ElasticSearch RCE 靶标介绍 ElasticSearch RCE 启动场景 漏洞利用 因查询时至少要求es中有一条数据,所以发送如下数据包,增加一个数据: POST /website/blog/ HTTP/1.1 Host: eci-2zedttamjkr80i9iubel.cloudeci…

VMware ubuntu空间越用越大

前言 用Ubuntu 1604编译了RK3399的SDK,之后删了一些多余的文件,df - h 已用21G,但window硬盘上还总用了185GB,采用了碎片整理,压缩无法解决 1 启动Ubuntu后, 安装 VMware Tools(T) 、 2 打开ubuntu终端,压…

Revit SDK 介绍:Ribbon 界面

前言 Revit 通过 API 将完整的 Ribbon 做了保留,同时这些菜单按钮也可以和相应的命令绑定。 内容 运行效果如下所示: 菜单特写: Ribbon Sample 整体是 API 暴露出来的一个 RibbonPanel,对应的接口: namespace Au…

FPGA GTH aurora 8b/10b编解码 PCIE 视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTH 全网最细解读GTH 基本结构GTH 发送和接收处理流程GTH 的参考时钟GTH 发送接口GTH 接收接口GTH IP核调用和使用 4、设计思路框架视频源选择silicon9011解码芯片配置及采集动态彩条视频数据组包GTH aurora 8b/10…

Java native 关键字

如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…

Flutter 中的单元测试:从工作流基础到复杂场景

对 Flutter 的兴趣空前高涨——而且早就应该出现了。 Google 的开源 SDK 与 Android、iOS、macOS、Web、Windows 和 Linux 兼容。单个 Flutter 代码库支持所有这些。单元测试有助于交付一致且可靠的 Flutter 应用程序,通过在组装之前先发制人地提高代码质量来确保不…

数据结构与算法(二)——前缀、中缀、后缀表达式

一、前缀表达式(波兰表达式) 1.1、计算机求值 从右至左扫描表达式,遇到数字时,将数字压入堆栈。遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素&#xff09…

Navicat导入Excel数据顺序变了

项目场景: Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中。但是,在导入的过程中,我们常会发现数据顺序出现了问题,导致数据错位,给数据的处理带来了极大的麻烦。 原因分析: 这个问题的…

mybatisplus配置拦截器实现保存加密,输出解密,模糊查询

前言:因公司需求需要把某些实体类的某些字段值进行加密保存,在查询时解密明文输出。现记录两种方式。 一、第一种方式: (1)使用TableField(typeHandler TypeHandler.class)注解自带的字段类型处理器,写一…

电脑死机的时候,CPU到底在做什么?

电脑死机,应该每个接触计算机的小伙伴都经历过吧。 尤其是早些年,电脑配置还没现在这么高的时候,多开几个重量级应用程序,死机就能如约而至,就算你把键盘上的CTRLALTDELETE按烂了,任务管理器也出不来&…

Mybatis-Genertor逆向工程

1、导入mybaties插件 <build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version><dependencies><dependency>…

Error: svn: E155004: Run ‘svn cleanup‘ to remove locks

解决办法如下&#xff1a;点击settings 点击清除缓存按钮&#xff0c;然后再使用svn进行提交更新操作&#xff0c;但是可能还会有其它的错误&#xff0c;比如svn: E230001: Server SSL certificate verification failed&#xff0c;解决这个错误请参考我另一篇文章&#xff1a;…

博客系统(升级(Spring))(一)创建数据库,创建实例化对象,统一数据格式,统一报错信息

博客系统&#xff08;一&#xff09; 博客系统一、创建项目二、建立数据库结构链接服务器和数据库和Redis 三、创建实例化对象四、统一数据结构结构 五、统一报错信息 博客系统 博客系统是干什么的&#xff1f; CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博…