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中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
python difflib模块示例讲解
Sep 13 Python
Python 获得13位unix时间戳的方法
Oct 20 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
python中协程实现TCP连接的实例分析
Oct 14 Python
Python对切片命名的实现方法
Oct 16 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
python判断变量是否为列表的方法
Sep 17 Python
Pycharm配置autopep8实现流程解析
Nov 28 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
python 把数据 json格式输出的实例代码
2016/10/31 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
Python骚操作之动态定义函数
2019/03/26 Python
实例详解Python装饰器与闭包
2019/07/29 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
餐饮业创业计划书范文
2014/01/06 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
校园之声广播稿
2014/01/31 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
会议室标语
2014/06/21 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
2015年城管个人工作总结
2015/05/15 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
python3 hdf5文件 遍历代码
2021/05/19 Python