python学习教程之Numpy和Pandas的使用


Posted in Python onSeptember 11, 2017

前言

本文主要给大家介绍了关于python中Numpy和Pandas使用的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

它们是什么?

NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

List、Numpy与Pandas

Numpy与List

相同之处:

  • 都可以用下标访问元素,例如a[0]
  • 都可以切片访问,例如a[1:3]
  • 都可以使用for循环进行遍历

不同之处:

  • Numpy之中每个元素类型必须相同;而List中可以混合多个类型元素
  • Numpy使用更方便,封装了许多函数,例如mean、std、sum、min、max等
  • Numpy可以是多维数组
  • Numpy用C实现,操作起来速度更快

Pandas与Numpy

相同之处:

  • 访问元素一样,可以使用下标,也可以使用切片访问
  • 可以使用For循环遍历
  • 有很多方便的函数,例如mean、std、sum、min、max等
  • 可以进行向量运算
  • 用C实现,速度更快

不同之处:Pandas拥有Numpy一些没有的方法,例如describe函数。其主要区别是:Numpy就像增强版的List,而Pandas就像列表和字典的合集,Pandas有索引。

Numpy使用

1、基本操作

import numpy as np
#创建Numpy
p1 = np.array([1, 2, 3])
print p1
print p1.dtype
[1 2 3]
int64
#求平均值
print p1.mean()
2.0
#求标准差
print p1.std()
0.816496580928
#求和、求最大值、求最小值
print p1.sum()
print p1.max()
print p1.min()
6
3
1
#求最大值所在位置
print p1.argmax()
2

2、向量运算

p1 = np.array([1, 2, 3])
p2 = np.array([2, 5, 7])
#向量相加,各个元素相加
print p1 + p2
[ 3 7 10]
#向量乘以1个常数
print p1 * 2
[2 4 6]
#向量相减
print p1 - p2
[-1 -3 -4]
#向量相乘,各个元素之间做运算
print p1 * p2
[ 2 10 21]
#向量与一个常数比较
print p1 > 2
[False False True]

3、索引数组

首先,看下面一幅图,理解下

python学习教程之Numpy和Pandas的使用

然后,咱们用代码实现看下

a = np.array([1, 2, 3, 4, 5])
print a
[1 2 3 4 5]
b = a > 2
print b
[False False True True True]
print a[b]
[3 4 5]

a[b]中,只会保留a中所对应的b位置为True的元素

4、原地与非原地

咱们先来看一组运算:

a = np.array([1, 2, 3, 4])
b = a
a += np.array([1, 1, 1, 1])
print b
[2 3 4 5]
a = np.array([1, 2, 3, 4])
b = a
a = a + np.array([1, 1, 1, 1])
print b
[1 2 3 4]

从上面结果可以看出来,+=改变了原来数组,而+没有。这是因为:

  • +=:它是原地计算,不会创建一个新的数组,在原始数组中更改元素
  • +:它是非原地计算,会创建一个新的数组,不会修改原始数组中的元素

5、Numpy中的切片与List的切片

l1 = [1, 2, 3, 5]
l2 = l1[0:2]
l2[0] = 5
print l2
print l1
[5, 2]
[1, 2, 3, 5]
p1 = np.array([1, 2, 3, 5])
p2 = p1[0:2]
p2[0] = 5
print p1
print p2
[5 2 3 5]
[5 2]

从上可知,List中改变切片中的元素,不会影响原来的数组;而Numpy改变切片中的元素,原来的数组也跟着变了。这是因为:Numpy的切片编程不会创建一个新数组出来,当修改对应的切片也会更改原始的数组数据。这样的机制,可以让Numpy比原生数组操作更快,但编程时需要注意。

6、二维数组的操作

p1 = np.array([[1, 2, 3], [7, 8, 9], [2, 4, 5]])
#获取其中一维数组
print p1[0]
[1 2 3]
#获取其中一个元素,注意它可以是p1[0, 1],也可以p1[0][1]
print p1[0, 1]
print p1[0][1]
2
2
#求和是求所有元素的和
print p1.sum()
41
[10 14 17]

但,当设置axis参数时,当设置为0时,是计算每一列的结果,然后返回一个一维数组;若是设置为1时,则是计算每一行的结果,然后返回一维数组。对于二维数组,Numpy中很多函数都可以设置axis参数。

#获取每一列的结果
print p1.sum(axis=0)
[10 14 17]
#获取每一行的结果
print p1.sum(axis=1)
[ 6 24 11]
#mean函数也可以设置axis
print p1.mean(axis=0)
[ 3.33333333 4.66666667 5.66666667]

Pandas使用

Pandas有两种结构,分别是Series和DataFrame。其中Series拥有Numpy的所有功能,可以认为是简单的一维数组;而DataFrame是将多个Series按列合并而成的二维数据结构,每一列单独取出来是一个Series。

咱们主要梳理下Numpy没有的功能:

1、简单基本使用

import pandas as pd
pd1 = pd.Series([1, 2, 3])
print pd1
0 1
1 2
2 3
dtype: int64
#也可以求和和标准偏差
print pd1.sum()
print pd1.std()
6
1.0

2、索引

(1)Series中的索引

p1 = pd.Series(
 [1, 2, 3],
 index = ['a', 'b', 'c']
)
print p1
a 1
b 2
c 3
dtype: int64
print p1['a']

(2)DataFrame数组

p1 = pd.DataFrame({
 'name': ['Jack', 'Lucy', 'Coke'],
 'age': [18, 19, 21]
})
print p1
age name
0 18 Jack
1 19 Lucy
2 21 Coke
#获取name一列
print p1['name']
0 Jack
1 Lucy
2 Coke
Name: name, dtype: object
#获取姓名的第一个
print p1['name'][0]
Jack
#使用p1[0]不能获取第一行,但是可以使用iloc
print p1.iloc[0]
age 18
name Jack
Name: 0, dtype: object

总结:

  • 获取一列使用p1[‘name']这种索引
  • 获取一行使用p1.iloc[0]

3、apply使用

apply可以操作Pandas里面的元素,当库里面没用对应的方法时,可以通过apply来进行封装

def func(value):
 return value * 3
pd1 = pd.Series([1, 2, 5])
print pd1.apply(func)
0  3
1  6
2 15
dtype: int64

同样可以在DataFrame上使用:

pd2 = pd.DataFrame({
 'name': ['Jack', 'Lucy', 'Coke'],
 'age': [18, 19, 21]
})
print pd2.apply(func)
age   name
0 54 JackJackJack
1 57 LucyLucyLucy
2 63 CokeCokeCoke

4、axis参数

Pandas设置axis时,与Numpy有点区别:

  • 当设置axis为'columns'时,是计算每一行的值
  • 当设置axis为'index'时,是计算每一列的值
pd2 = pd.DataFrame({
 'weight': [120, 130, 150],
 'age': [18, 19, 21]
})
0 138
1 149
2 171
dtype: int64
#计算每一行的值
print pd2.sum(axis='columns')
0 138
1 149
2 171
dtype: int64
#计算每一列的值
print pd2.sum(axis='index')
age  58
weight 400
dtype: int64

5、分组

pd2 = pd.DataFrame({
 'name': ['Jack', 'Lucy', 'Coke', 'Pol', 'Tude'],
 'age': [18, 19, 21, 21, 19]
})
#以年龄分组
print pd2.groupby('age').groups
{18: Int64Index([0], dtype='int64'), 19: Int64Index([1, 4], dtype='int64'), 21: Int64Index([2, 3], dtype='int64')}

6、向量运算

需要注意的是,索引数组相加时,对应的索引相加

pd1 = pd.Series(
 [1, 2, 3],
 index = ['a', 'b', 'c']
)
pd2 = pd.Series(
 [1, 2, 3],
 index = ['a', 'c', 'd']
)
print pd1 + pd2
a 2.0
b NaN
c 5.0
d NaN
dtype: float64

出现了NAN值,如果我们期望NAN不出现,如何处理?使用add函数,并设置fill_value参数

print pd1.add(pd2, fill_value=0)
a 2.0
b 2.0
c 5.0
d 3.0
dtype: float64

同样,它可以应用在Pandas的dataFrame中,只是需要注意列与行都要对应起来。

总结

这一周学习了优达学城上分析基础的课程,使用的是Numpy与Pandas。对于Numpy,以前在Tensorflow中用过,但是很不明白,这次学习之后,才知道那么简单,算是有一定的收获。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考

Pandas 使用指南(上) 基本数据结构

Python 相关文章推荐
python使用xmlrpc实例讲解
Dec 17 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
python统计文本文件内单词数量的方法
May 30 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
Python操作CSV格式文件的方法大全
Jul 15 Python
Python使用struct处理二进制的实例详解
Sep 11 #Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 #Python
Python 高级专用类方法的实例详解
Sep 11 #Python
Python 异常处理的实例详解
Sep 11 #Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 #Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 #Python
详解 Python 与文件对象共事的实例
Sep 11 #Python
You might like
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
初探nodeJS
2017/01/24 NodeJs
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
详解Python如何生成词云的方法
2018/06/01 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
init进程的作用
2015/08/20 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
护士岗位职责
2014/02/16 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
护士年终考核评语
2014/12/31 职场文书
会计求职信怎么写
2015/03/20 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
python基础之文件处理知识总结
2021/05/23 Python
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android