Basic knowledge of Pandas

pandas库是以numpy库为基础建成的,是python数据分析的核心库。也正因如此,pandas内的数据结构与numpy的数组有许多相似的地方。

以下的代码示例均是在引入numpy和pandas库的基础上,不要忘记!

Pandas库数据结构简介

Series对象

Series对象用来存放一维数据,由两个相互关联的数组组成。index数组存放索引(令人惊喜的是,索引可以有重复),values数组存放值。其实index对象使得操作Series和DataFrame十分方便(后面会单独拿出来一节将index对象)

声明Series对象

  1. //使用序列创建Series对象
  2. s = pd.Series([1, 2, 3])
  3. s = pd.Series((1, 2, 3))
  4. s = pd.Series(range(0, 6)) //别忘记range也是一种序列对象
  5. s = pd.Series(np.arange(0, 6))
  6. //使用字典创建Series对象
  7. dict = {'red': 2000, 'blue': 1000, 'orange': 5000}
  8. s = pd.Series(dict)
  9. //单从效果上来看是直接构造了自定义索引的index对象,该Series对象可以当做字典使用
  10. //使用其他Series对象构造Series对象
  11. s0 = pd.Series(range(6))
  12. s1 = pd.Series(s0)
  13. //值得注意的是!以此种方式构造的Series并不是副本而是元Series对象的引用!改变原对象会对新对象产生影响
  14. //构造时添加索引(在后面Index对象部分会细讲)
  15. s = pd.Series(np.arange(5), index=['one', 'two', 'three', 'four', 'five'])
  16. '''
  17. 得到的Series对象s为
  18. one 0
  19. two 1
  20. three 2
  21. four 3
  22. five 4
  23. dtype: int32
  24. '''
  25. //可以通过以下方式查看索引与值数组
  26. s.values
  27. s.index

操作Series对象

获取Series内部对象

像numpy中操作数组一样操作Series对象

  1. a = pd.Series([1, 2, 3, 4, 5])
  2. //索引与切片
  3. a[1]
  4. a[-1]
  5. a[0:2]
  6. a[0:5:2]
  7. a[5:0:-1]
  8. //筛选
  9. a[a>3] //返回一个Series对象,内部元素为大于3的值. 这个中括号内的a代指每一个元素!
  10. //取对应标签元素
  11. b = pd.Series([1, 2, 3, 4, 5],
  12. index=['one', 'two', 'three', 'four', 'five'])
  13. b[['one', 'four']] //取出索引为'one'和'four'的元素.

Series对象的可变性

  1. // Series对象的Values数组是可变的, 自由但是安全性需要注意
  2. a = pd.Series([1, 2, 3])
  3. a[0] = 3
  4. //你甚至可以这样改变index, 但是values无法被更改, 虽然可以逐个更改
  5. a.index = ['one', 'two', 'three']

Series对象的查重, 包含关系的判断

我们已经领略了Series对象的高度自由, 不过这还不算什么, 好戏在后头呢.

Series对象允许values数组内部元素重复, 那有没有什么方法能实现快速查找重复元素并计数呢?

  1. s = pd.Series([1, 0, 2, 1, 2, 3],
  2. index=['white', 'white', 'blue', 'green',' green','yellow'])
  3. s.unique() //返回array([1, 0, 2, 3], dtype=int64), 返回一个包含s中不重复元素的数组
  4. s.value_counts() //统计重复元素个数
  5. //返回值为:
  6. //2 2
  7. //1 2
  8. //3 1
  9. //0 1
  10. //有的同学可能想问, 有没有index_count呢? 联想是好的, 不过确实没有, 还是自己写一个吧! = W =

Series同时竟还也允许index数组内部元素重复! 也就是允许一对多!

  1. a = pd.Series([1, 2, 3], index=['blue', 'blue', 'red']) //多强啊!
  2. '''
  3. blue 1
  4. blue 2
  5. red 3
  6. dtype: int64
  7. '''
包含关系的判断

isin方法可以实现这个功能, 不过它的设计可能有点反人类. (额, 尤其是学完java的同学, 学python尤其是它的开源库简直煎熬好吗? 就指命名上)

  1. s.isin([0, 3]) //判断[0, 3]是否包含在数据结构中
  2. //值得注意的是: isin接收序列为参数, 它的含义是(以这个为例)0与3, 而不是0-3的元素!
  3. '''返回一个布尔数组
  4. white False
  5. white True
  6. blue False
  7. green False
  8. green False
  9. yellow True
  10. dtype: bool
  11. '''

Series对象的基本算术运算

就像在前面提到过的,Pandas库是建立在Numpy库基础上的,对Numpy数组的许多运算可以直接在Pandas库都为对象中使用,下面的代码示例会提到这一点

  1. // 以下运算均为元素级运算(即对Series内的每一个元素进行运算,在numpy中曾提到过)
  2. a = pd.Series([1, 2, 3])
  3. b = pd.Series([4, 5, 6])
  4. a + b //对应元素相加,如果两Series长度不相同,多出的一位由Nan代替(not a number)
  5. a - b
  6. a * b
  7. a / b
  8. a // b
  9. a % b
  10. a ** b
  11. // 以下为基本函数操作(过于基础,和算术运算符放在一起)
  12. //Series对象可以被numpy中的数学函数实现元素级运算或聚合运算
  13. np.log(a)
  14. np.mean(a)
  15. //几乎所有函数都可以,这里不列举太多(to name but a few)

DataFrame对象

DataFame对象用来存储多维数据, 其设计目的就是将Series对象拓展至多维 (这在暗示DataFrame有很多特性与Series相似), 下图为基本示例

DataFrame对象可以理解为一个由Series组成的字典, column index为字典的key (当然, 这只是一种理解, 形式上很相似)

创建DataFrame对象

刚才说过了, DataFrame可以理解为Series的字典, 那么就用字典来初始化吧!

  1. dict = {'color': ['blue', 'green', 'yellow', 'red', 'white'],
  2. 'object': ['ball', 'pen', 'pencil', 'paper', 'mug'],
  3. 'price': [1.2, 1.0, 0.6, 0.9, 1.7]}
  4. //你甚至可以通过嵌套字典来构造DataFrame对象, 像这样通过嵌套结构来构造时, 不够的元素会被nan填充
  5. frame = pd.DataFrame(dict, index=['one', 'two', 'three', 'four', 'five'])
  6. '''
  7. color object price
  8. one blue ball 1.2
  9. two green pen 1.0
  10. three yellow pencil 0.6
  11. four red paper 0.9
  12. five white mug 1.7
  13. '''
  14. //我们可以选取特定列进行构造
  15. //通过columns属性指定相关列
  16. frame2 = pd.DataFrame(dict, columns=['color', 'price'],
  17. index=['one', 'two', 'three', 'four', 'five'])
  18. '''
  19. color price
  20. one blue 1.2
  21. two green 1.0
  22. three yellow 0.6
  23. four red 0.9
  24. five white 1.7
  25. '''
  26. //可以通过index, values, columns属性来查看相关信息

通过多维序列初始化 (通常使用arange和reshape)

  1. frame3 = pd.DataFrame(np.arange(16).reshape((4, 4)), index = ['red', 'blue', 'yellow', 'white'],
  2. columns=['ball', 'pen', 'pencil', 'paper'])

操作DataFrame对象

选取DataFrame元素

  1. frame = pd.DataFrame(np.arange(16).reshape((4, 4)),
  2. index=['red', 'blue',' yellow', 'white'],
  3. columns=['ball', 'pen', 'pencil', 'paper'])
  4. '''
  5. ball pen pencil paper
  6. red 0 1 2 3
  7. blue 4 5 6 7
  8. yellow 8 9 10 11
  9. white 12 13 14 15
  10. '''
  11. //对列的选取, 返回Series对象
  12. frame['ball']
  13. frame.ball //像查看属性一样查看列
  14. //你只要将DataFrame类比为Series的字典就很好理解
  15. //对行的选取(也就是index), 返回Series对象
  16. frame.loc('red')
  17. frame.loc(['red', 'blue']) //选取多个行
  18. //选取DataFrame的部分
  19. frame[1:3] //相当于选取0-1行, 0-3列
  20. '''
  21. ball pen pencil paper
  22. blue 4 5 6 7
  23. yellow 8 9 10 11
  24. '''
  25. //选取DataFrame的单个元素, 像操作多维数组一样
  26. frame['pen']['red'] //注意是先选列后选行!

DataFrame对象的修改

  1. 为了增加可读性, 可以为index和columns属性指定名称

    1. frame.index.name = 'color'
    2. frame.columns.name = 'item'
    3. '''
    4. item ball pen pencil paper
    5. color
    6. red 0 1 2 3
    7. blue 4 5 6 7
    8. yellow 8 9 10 11
    9. white 12 13 14 15
    10. '''
  2. 添加列

    1. frame['new'] = 12
    2. //frame会产生新的一列, 其所有元素均为12
    3. frame['new'] = [1, 2, 3, 4]
    4. //也可以借助序列对象, 例如range, np,arange并通过list转化为列表
  3. 添加行 (与列几乎一样)

    1. frame.loc('new') = 12
    2. //frame会产生新的一行, 其所有元素均为12
    3. frame.loc('new') = [1, 2, 3, 4]
    4. //与列同理
  4. 删除

    1. del frame['new']
    2. //是在原对象上进行修改, 删除new列
    3. //其实del几乎能删除一切你想删掉的东西(指对象), 无法删除函数调用(即使返回对象)
    4. //无法删除行的原因就是上一句话, loc方法是一个函数!

DataFrame对象的筛选

  1. //与Numpy中数组, Pandas中的Series一样
  2. frame[frame>0]
  3. //会返回一个布尔数组

判断元素所属关系

  1. frame.isin([0, 3]) //与Series一样

Index对象基础

像Series对象和DataFrame对象在数据分析方面的绝大多数优秀特性都取决于完全整合到这些数据结构中的Index对象

Pandas中的Index对象是不可变的

以下的代码对Series和DataFrame均有效

  1. 查看index索引
  1. ser = pd.Series([1, 2, 3], index=['one', 'two', 'three'])
  2. //查看标签的最值(字符串由字典顺序)
  3. ser.idmax() //index索引最大值
  4. ser.idmin() //index索引最小值
  5. //查看数据结构是否有重复索引, 通过查看index的is_unique属性
  6. ser.index.is_unique
  1. 更换索引

    通过reindex方法可以更换Series对象的索引, 生成一个新对象.

    1. ser.reindex(['1', '2', '3'])
    2. //你甚至可以在这个过程中实现删除与添加, 多添加即为增加(nan), 减少即为删除 ----不要忘记是返回新对象

    reindex的自动编制索引功能

    1. ser = pd.Series([1, 5, 6, 3], index=[0, 3, 5, 6])
    2. '''
    3. 0 1
    4. 3 5
    5. 5 6
    6. 6 3
    7. '''
    8. //索引列并不是连续的, 可以通过给reindex传参实现智能调整(ffill, bfill)
    9. ser.reindex(range(6), method='ffill')
    10. '''
    11. 0 1
    12. 1 1
    13. 2 1
    14. 3 5
    15. 4 5
    16. 5 6
    17. '''
    18. ser.reindex(range(6), method='bfill')
    19. '''
    20. 0 1
    21. 1 5
    22. 2 5
    23. 3 5
    24. 4 6
    25. 5 6
    26. '''
    27. //ffill与bfill的区别在于, ffill将缺失的部分向前取等
    28. //bfill则是向后 (front与back)
    29. //对于DataFrame甚至可以更换行与列(你甚至可以同时更换)
  2. 删除

    drop方法返回不含某几行或某几列的新对象

    1. //对于Series
    2. ser = pd.Series(np.arange(2.), index=['red', 'blue'])
    3. ser.drop('yellow') //删除标签为yellow的这一行
    4. ser.drop(['yellow', 'white'])
    5. //对于DataFrame
    6. frame = pd.DataFrame(np.arange(16).reshape((4, 4)),
    7. index=['red', 'blue', 'yellow', 'white'],
    8. columns=['ball', 'pen', 'pencil',' paper'])
    9. frame.drop(['blue','yellow']) //删除多行
    10. frame.drop(['pen', 'pencil', axis=1]) //沿着1轴删除多列, axis=1轴即是沿着列
    1. 算数与数据对齐

      这是体现pandas中数据结构灵活的特点的一个地方, Series和DataFrame之间的运算是将数据结构的索引对齐后进行元素级运算. 如果双方标签的集合不同, 取两者并集并在对应位置上放置nan(非常好理解)


数据结构之间的运算

基本算数运算方法

add, sub, div, mul

其实它们就是+ - * \ (其实其他的例如 % // 也都也可以参与运算)

DataFrame与Series之间的运算

由于我们可以将DataFrame视作Series的字典, 所以就很显然.

运算的前提是让Series对象的索引和DataFrame对象的列名保持一致(广播机制)

  1. frame = pd.DataFrame(np.arange(16).reshape((4, 4)),
  2. index=['red', 'blue', 'yellow', 'white'],
  3. columns=['ball', 'pen', 'pencil', 'paper'])
  4. '''
  5. ball pen pencil paper
  6. red 0 1 2 3
  7. blue 4 5 6 7
  8. yellow 8 9 10 11
  9. white 12 13 14 15
  10. '''
  11. ser = pa.Series(np.arange(4), index=['ball','pen', 'pencil', 'paper'])
  12. frame + ser
  13. '''
  14. ball pen pencil paper
  15. red 0 2 4 6
  16. blue 4 6 8 10
  17. yellow 8 10 12 14
  18. white 12 14 16 18
  19. '''
  20. //其实就是横着加
  21. //如果有的标签只存在于是个数据结构中, 那么该列会生成nan

函数应用和映射

元素级函数

这类函数被称为通用函数, 对数据结构内的每一个元素进行操作, 其实大多数都是numpy里的内容.

按行或列操作的函数

apply方法(与numpy多维数组中的apply_along_axis几乎一样)可以对元素的每一列执行同一函数(这个函数甚至可以是自定义的)

  1. frame.apply(lambda x: x.max() - x.min()) //默认沿着0轴
  2. frame.apply(lambda x: x.max() - x.min(), axis=1) //沿着1轴

apply函数不仅可以返回标量, 也可以返回Series (要注意的是apply函数是对一行或列执行, 因此返回值总是升1维的, 也就是每行都返回一个标量会香橙Series, 每一行返回一个Series会形成DataFrame)

统计函数

numpy的大多数统计函数对pandas中的对象仍然生效, 没有必要使用apply函数

常用的有mean, sum等

describe方法可以返回多个统计量

排序与排位次

  1. 对标签或列排序

    sort_index方法返回一个顺序不同的新对象(Series, DataFrame通用)

  1. ser.sort_index()
  2. ser.sort_index(ascending=False) //降序
  3. //特殊地, 对于DataFrame, 可以通过axis指定列或index
  4. frame.sort_index(axis=1)
  1. 对值进行排序

    sort_values方法同样返回新对象

    1. ser.sort_values()
    2. ser.sort_values(ascending=False)
    3. frame.sort_values(by='pen') //指定按照pen列为标准排序
    4. frame.sort_values(by=['pen', 'ball']) // 先看pen列, 若pen列已是顺序, 再看ball列.
    5. //同样也可基于更多列
  2. 排位次操作

    位次rank是排序的基石, 也就是说我们可以通过rank方法改变排序的结果

    1. ser.rank() //查看Series的rank值
    2. ser.rank(method='first') //以当前位置定rank, 即当前顺序为标准顺序
    3. ser.rank(ascending=False) //按降序排位次

相关性和协方差

通过corr和cov函数计算两Series对象的相关性与协方差.

调用DataFrame对象的corr或cov方法可计算单个DataFrame对象的相关性与协方差

使用corrwith可计算DataFrame的行或列与Series对象的相关性

NaN数据的处理

  1. 为元素赋NaN值, 使用np.nan或np.NaN

  2. dropna方法或使用过滤(使用notnull作为条件)可实现对nan的过滤

    1. ser.dropna()
    2. ser[ser.notnull()]
    3. //对于DataFrame, 我们想要去除全部元素为nan的行或列(而不是有nan就删整行)
    4. frame.dropna(how='all') //只会删除全为nan的
  3. 为nan赋值

    1. frame.fillna(0) //为所有nan值赋0值
    2. //可是使用字典来为不同的nan赋不同值
    3. frame.fillna({'ball':1, 'mug':0, 'pen':99}) //不同列的nan会被替换为相应的值

等级索引和分级

  1. 等级索引是pandas的重要功能, 单条轴可以有多级索引, 可以实现像操作两维结构那样操作多维结构
  1. mser = pd.Series(np.random.rand(8),
  2. index=[['white', 'white', 'white', 'blue', 'blue', 'red', 'red', 'red'], ['up', 'down', 'right', 'up', 'down', 'up', 'down', 'left']])
  3. '''
  4. white up 0.465747
  5. down 0.318715
  6. right 0.576776
  7. blue up 0.975598
  8. down 0.593504
  9. red up 0.491182
  10. down 0.854766
  11. left 0.194188
  12. dtype: float64
  13. '''
  14. //对于DataFrame可以对其行与列均定义登记索引
  1. 等级索引的基本操作
  1. mser['white']
  2. mser[:,'up']
  3. mser['white':'up']
  4. //unstack方法, 将等级索引Series转化为DataFrame
  5. //stack方法, 将DataFrame转化为等级索引的Series对象
  1. 新调整顺序

​ swaplevel方法可以互换两个层级, 以层级的名称为参数!!!!!! 名称是index和columns的name属性!!!!!

​ sort_index方法可以通过传参数level(同样接收name)来制定对哪个层级将数据排序

  1. 按层级统计数据

    对函数传level参数指定层级名称即可

    1. mframe.sum(level='colors')
    2. mframe.sum(level='colors', axis=1)

Pandas基础笔记的更多相关文章

  1. Python Numpy,Pandas基础笔记

    Numpy Numpy是python的一个库.支持维度数组与矩阵计算并提供大量的数学函数库. arr = np.array([[1.2,1.3,1.4],[1.5,1.6,1.7]])#创建ndarr ...

  2. python学习笔记(四):pandas基础

    pandas 基础 serise import pandas as pd from pandas import Series, DataFrame obj = Series([4, -7, 5, 3] ...

  3. 利用Python进行数据分析(12) pandas基础: 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...

  4. 利用Python进行数据分析(9) pandas基础: 汇总统计和计算

    pandas 对象拥有一些常用的数学和统计方法.   例如,sum() 方法,进行列小计:   sum() 方法传入 axis=1 指定为横向汇总,即行小计:   idxmax() 获取最大值对应的索 ...

  5. 利用Python进行数据分析(8) pandas基础: Series和DataFrame的基本操作

    一.reindex() 方法:重新索引 针对 Series   重新索引指的是根据index参数重新进行排序. 如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行. 不想用缺失值,可以用 ...

  6. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  7. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  8. php代码审计基础笔记

    出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...

  9. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

随机推荐

  1. IEnumerable< T >和IEnumerable区别 |枚举接口

    为什么我们在继承IEnumerable< T >接口的时候也要实现IEnumerable接口. 新的代码里面都用IEnumerable< T >,因为泛型的类型是安全的.我们可 ...

  2. Winfrom中关于toolStrip工具栏中按钮背景的设置

    在ToolStrip中可以存放很多种控件,一般来说,主要使用的是Button和DropDownButton,通常情况下,Button需要设置图片和文字,网上找了很多个方法都不太靠谱,自己试验了下,下面 ...

  3. MySQL创建表、更改表和删除表

    1.创建表 mysql> create table t_address( -> id int primary key auto_increment, // 设置id为主键,自动增值 -&g ...

  4. win7重装系统过程关机 电脑开机黑屏 硬盘无法识别 无法使用u盘启动

    问题:win7重装系统中强制重启导致硬盘无法识别,开机后无法选择使用u盘启动盘启动,电脑黑屏,将硬盘拆掉可以使用u盘启动,使用SATA转接口在win7中有反应但无法识别 无法识别原因:重装系统过程中断 ...

  5. Python:构建可执行exe文件

    学习自: Python 程序打包成 exe 可执行文件 - 不夜男人 - 博客园 Python生成Windows可执行exe文件 - 韩小北 - 博客园 pyinstaller参数介绍以及总结_Bea ...

  6. 普通web整合quartz跑定时任务

    一.场景(什么时候用到定时任务) 文件跑批,定时处理数据,和业务解耦的场景 二.目前都有哪些工具可以定时处理数据 1.jdk的timertask:数据量小的情况下,单线程的 2.kettle:比较适合 ...

  7. Laravel-自带分页+搜索

    public function getNewsList(){ $condition = []; $cond = []; if (!empty($_GET['title'])) { array_push ...

  8. i++ 反编译码

    1.特点: 操作数栈,主要用于保存计算过程中的结果,同时作为集计算过程中变量临时的存储空间. 操作数栈就是JVM执行引擎的一个工作区,当方法执行开始,一个新栈帧也会随之被创建,这个方法的操作数栈是空的 ...

  9. java控制流学习

    java流程控制学习 Scanner对象 概念 1.通过Scanner类实现程序和人的交互,通过它获取到用户的输入.java.util.Scanner是java5的特征. 我们可以通过Scanner类 ...

  10. MacBook苹果电脑绕过BootCamp安装Win7双系统

    上周老婆的一个朋友的笔记本电脑说电脑太慢说帮忙清理一下电脑,我一看是MACBOOKPRO 的笔记装的双系统,之前一直接触的都是WINDOWS居多.想着干脆装个WIN10吧,谁知道一下就跳坑里了,一分区 ...