本章介绍pandas的重要功能,只记录一些重点内容

1、重新索引

pandas对象的一个重要方法是reindex,其作用是创建一个适应用新索引的新对象

  1. #重新索引
  2. obj = pd.Series([4.5, 7.2, -5.3, 3.6], index = ['d', 'b', 'a', 'c'])
  3. obj
  4. #调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值
  5. obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
  6. obj2
  7. obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value = 0)
  8. #对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到些目标
  9. #使用ffill实现前向值填充
  10. obj3 = pd.Series(['blue', 'purple', 'yellow'], index = [0, 2, 4])
  11. obj3.reindex(range(6), method = 'ffill')
  12.  
  13. #reindex的(插值)method选项
  14. #ffill 或 pad 前向填充值; bfill 或 backfill 后向填充值
  15. obj2.ix[['a']]

输出结果

  1. obj = pd.Series([4.5, 7.2, -5.3, 3.6], index = ['d', 'b', 'a', 'c'])
  2.  
  3. obj
  4. Out[15]:
  5. d 4.5
  6. b 7.2
  7. a -5.3
  8. c 3.6
  9. dtype: float64
  10. obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])
  11.  
  12. obj2
  13. Out[17]:
  14. a -5.3
  15. b 7.2
  16. c 3.6
  17. d 4.5
  18. e NaN
  19. dtype: float64
  20.  
  21. obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value = 0)
  22. Out[18]:
  23. a -5.3
  24. b 7.2
  25. c 3.6
  26. d 4.5
  27. e 0.0
  28. dtype: float64
  29.  
  30. obj3 = pd.Series(['blue', 'purple', 'yellow'], index = [0, 2, 4])
  31.  
  32. obj3.reindex(range(6), method = 'ffill')
  33. Out[20]:
  34. 0 blue
  35. 1 blue
  36. 2 purple
  37. 3 purple
  38. 4 yellow
  39. 5 yellow
  40. dtype: object
  41.  
  42. obj2.ix[['a']]
  43. Out[21]:
  44. a -5.3
  45. dtype: float64

reindex函数的参数

2、丢弃指定轴上的项

丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。

drop方法返回的是一个在指定轴上删除了指定值的新对象

  1. #定义一个数组,索引为 ['a', 'b', 'c', 'd', 'e']
  2. obj = pd.Series(np.arange(5.), index = ['a', 'b', 'c', 'd', 'e'])
  3. obj
  4. new_obj = obj.drop('c')
  5. new_obj
  6. obj.drop(['d', 'c'])
  7. #对DataFrame, 可以删除任意轴上的索引值

3、索引、选取和过滤

为了在DataFrame的行上进行标签索引,引入专门的索引字段ix,可以通过NumPy式的标记法以及轴标签从DataFrame中选取行和列的子集。

  1. #为了在DataFrame的行上进行标签索引,引入专门的索引字段ix,可以通过NumPy式的标记法以及轴标签从DataFrame中选取行和列的子集。
    data = pd.DataFrame(np.arange(16).reshape((4, 4)), \
                        index = ['Ohio', 'Colorado', 'Utah', 'New York'], \
                        columns = ['one', 'two', 'three', 'four'])
    data
  2.  
  3. data.ix['Colorado', ['two', 'three']]
    data.ix[['Colorado', 'Utah'], [3, 0, 1]]
    #3,0,1代表列标识
    data.ix[2]
    #第2行
    data.ix[:'Utah', 'two']
    data.ix[data.three>5, :3]

注意:在设计pandas时, 我觉得必须输入frame[:, col]才能选取列实在有些啰嗦,而且还很容易出错,因为列的选取是一种最常见的操作

于是,我就把所有的标签索引功能都放在ix中了

DataFrame的索引选项

4、算术运算和数据对齐

pd最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集

  1. #算术运算和数据对齐
  2. s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index = ['a', 'c', 'd', 'e'])
  3. s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index = ['a', 'c', 'e', 'f', 'g'])
  4. s1, s2
  5. s1 + s2
  6. #list('bcd'),相当于列元素,b, c, d
  7. df1 = pd.DataFrame(np.arange(9).reshape((3, 3)), columns = list('bcd'), index = \
  8. ['Ohio', 'Texas', 'Colorado'])
  9. df2 = pd.DataFrame(np.arange(12).reshape((4, 3)), columns = list('bde'), index = ['Utah', 'Ohio', 'Texas', 'Oregon'])
  10. df1, df2
  11. df1 + df2
  12.  
  13. #在算术方法中填充值
  14. df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), columns = list('abcd'))
  15. df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), columns = list('abcde'))
  16. df1
  17. df2
  18. #将它们相加时,没有重叠的位置会产生Na
  19. df1 + df2
  20.  
  21. #使用df1的add方法,传入df2以及一个fill_value参数
  22. df1.add(df2, fill_value = 0)
  23. #在对Series或DataFrame重新索引时,也可以指定一个填充值
  24. df1.reindex(columns = df2.columns, fill_value = 0)

灵活的算术方法

5、DataFrame和Series之间的运算

  1. #DataFrame和Series之间的运算
  2. arr = np.arange(12.).reshape((3, 4))
  3. arr
  4. arr[0]
  5. arr - arr[0]
  6. #以上叫做广播
  7. #DataFrame和Series之间的运算示例
  8. frame = pd.DataFrame(np.arange(12).reshape((4, 3)), columns = list('bde'), index = ['Utah', 'Ohio', 'Texas', 'Oregon'])
  9. #选取标识为0的行,即第一行
  10. series = frame.ix[0]
  11. frame
  12. series
  13.  
  14. #默认情况下,DataFrame和Series之间的运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播
  15. frame - series
  16.  
  17. #如果找不到,则参与运算的两个对象就会被重新索引以形成并集
  18. series2 = pd.Series(range(3), index = list('bef'))
  19. series2
  20. frame + series2

6、函数应用与映射

  1. #函数应用和映射
  2. frame = pd.DataFrame(np.random.randn(4, 3), columns = list('bde'), index = ['Utah', 'Ohio', 'Texas', 'Oregon'])
  3. frame
  4. np.abs(frame)
  5.  
  6. #另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现功能
  7. #x为输入值,x.max() - x.min()为输出值
  8. f = lambda x: x.max() - x.min()
  9. #输入列最大减最小
  10. frame.apply(f)
  11. #输入行最大减最小
  12. frame.apply(f, axis = 1)

许多最为常见的数组都被实现 成DataFrame方法,如sum和mean,因此无需使用apply方法

除标量值外,传递给apply的函数还可以返回由多个值 组成的Series

  1. def f(x):
  2. return pd.Series([x.min(), x.max()], index = ['min', 'max'])
  3. #还是调用行
    frame.apply(f)
  4.  
  5. frame.apply(f)
    Out[82]:
                b         d         e
    min -2.460592 -0.224366 -0.474713
    max  0.102727  0.183401  0.485874
  1. #可以尝试一下调用列
    frame.apply(f, axis = 1)
    Out[83]:
                 min       max
    Utah   -1.158899  0.201939
    Ohio   -0.162430  0.485874
    Texas  -0.474713 -0.112733
    Oregon -2.460592  0.183401
  1. #此外,元素级的python函数也是可以用的,假如你想得到frame中各个浮点值的格式化字符串,使用applymap即可
  2. #输入元素x为两位小数的浮点字符
  3. format = lambda x: '%.2f' % x
  4. frame.applymap(format)
  1. format = lambda x: '%.2f' % x
  2.  
  3. frame.applymap(format)
  4. Out[85]:
  5. b d e
  6. Utah -1.16 -0.22 0.20
  7. Ohio 0.10 -0.16 0.49
  8. Texas -0.22 -0.11 -0.47
  9. Oregon -2.46 0.18 0.16

之所以中到applymap, 是因为Series有一个用于应用元素级函数的map方法:

  1. #之所以中到applymap, 是因为Series有一个用于应用元素级函数的map方法:
    #指定e列
  2. frame['e'].map(format)
    Out[86]:
    Utah       0.20
    Ohio       0.49
    Texas     -0.47
    Oregon     0.16
    Name: e, dtype: object

7、排序与排名

根据条件对数据集排序 也是一种重要的内置运算。要对行或列索引进行排序,可使用sort_index方法,它将返回一个已排序的新对象

  1. #排序和排名
  2. obj = pd.Series(range(4), index = ['d', 'a', 'b', 'c'])
  3. obj.sort_index()
  1. obj.sort_index()
  2. Out[88]:
  3. a 1
  4. b 2
  5. c 3
  6. d 0
  7. dtype: int32
  1. #根据任意一个轴上的索引进行排序
  2. frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index = ['three', 'one'], columns = ['d', 'a', 'b', 'c'])
  3. frame
  4. #按行索引进行排序
  5. frame.sort_index()
  6. #按列索引进行排序
  7. frame.sort_index(axis = 1)
  8. #数据默认是按升序排序的,但也可以降序排序
  9. frame.sort_index(axis =1, ascending = False)
  10. #若要按值对Series进行排序,可使用其order方法
  11. obj = pd.Series([4, 7, -3, 2])
  12. obj
  13. obj.order()
  14.  
  15. #在排序时,任何缺失 值默认都会被放到Series的末尾
  16. obj = pd.Series([4, np.nan, 7, np.nan, -3, 2])
  17. obj
  18. obj.order()
  19. #希望根据一个或多个列中的值进行排序,将一个或多个列的名字传递给by选项即可
  20. frame = pd.DataFrame({'b':[4, 7, -2, 3], 'a':[0, 1, 0, -1]})
  21. frame
  22. frame.sort_index(by = 'b')
  23. #根据a, b进行排序
  24. frame.sort_index(by = ['a', 'b'])

排名跟排序关系密切,且它会增设一个排名值(从1开始, 一直到数组中有效数据的数量)

它跟numpy.argsort产生的间接排序索引差不多,只不过它可以根据某种规则破坏平级关系。

接下来介绍rank 方法。默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的

  1. #排名,rank方法
  2. obj = pd.Series([7, -5, 7, 4, 2, 0 ,4])
  3. obj
  4. obj.rank()
  1. obj.rank()
  2. Out[107]:
  3. 0 6.5
  4. 1 1.0
  5. 2 6.5
  6. 3 4.5
  7. 4 3.0
  8. 5 2.0
  9. 6 4.5
  10. dtype: float64
  1. #也可以根据值在原数据中出现的顺序给出排名
  2. obj.rank(method = 'first')
  3.  
  4. obj.rank(method = 'first')
  5. Out[108]:
  6. 0 6.0
  7. 1 1.0
  8. 2 7.0
  9. 3 4.0
  10. 4 3.0
  11. 5 2.0
  12. 6 5.0
  13. dtype: float64
  1. #按降序进行排名
  2. obj.rank(ascending = False, method = 'max')
  3.  
  4. obj.rank(ascending = False, method = 'max')
  5. Out[109]:
  6. 0 2.0
  7. 1 7.0
  8. 2 2.0
  9. 3 4.0
  10. 4 5.0
  11. 5 6.0
  12. 6 4.0
  13. dtype: float64

8、带有重复值的轴索引

以上介绍的所有范例都有着唯一的轴标签(索引值)。虽然许多pd函数(如reindex)都要求标签唯一,但这并不是强制性的

  1. #带有重复值的轴索引
  2. obj = pd.Series(range(5), index = ['a', 'a', 'b', 'b', 'c'])
  3. obj
  4. #索引的is_unique属性可以告诉你它的值是唯一的
  5. obj.index.is_unique
  1. obj.index.is_unique
  2. Out[112]: False

对于带有重复值的索引,数据选取的行为将会有些不同,如果某个索引对应多个值,则返回一个Series;而对应单个值的,则返回一个标量值

  1. #对DataFrame的行进行索引时也是如此
  2. df = pd.DataFrame(np.random.randn(4, 3), index = ['a', 'a', 'b', 'b'])
  3. df
  4. df.ix['b']
  1. df
  2. Out[116]:
  3. 0 1 2
  4. a 0.747649 2.128339 -1.192042
  5. a 0.479568 1.813696 -0.197266
  6. b 0.340015 -0.187988 1.244151
  7. b -1.858814 -0.188538 -0.985478
  8.  
  9. df.ix['b']
  10. Out[117]:
  11. 0 1 2
  12. b 0.340015 -0.187988 1.244151
  13. b -1.858814 -0.188538 -0.985478

上面介绍 了pandas数据处理的基础知识,以后可以查阅并参考,接下来将pandas汇总和计算描述统计进行梳理

【学习】数据处理基础知识(基本功能)【pandas】的更多相关文章

  1. 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))

    关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...

  2. jQuery学习笔记 - 基础知识扫盲入门篇

    jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...

  3. Ant学习-001-ant 基础知识及windows环境配置

    一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.T ...

  4. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  5. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  6. 学习Python3基础知识过程中总结

    print()中end==""的用法 例子:用Python3输出九九乘法表: for i in range(1,10): for j in range(1,i+1): s=i*j ...

  7. 【学习】基础知识:数组和矢量计量【Numpy】

    Numpy是高性能科学计算和数据分析的基础包.功能如下: ndarray 一个具有矢量算法运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环) 用于读 ...

  8. three.js学习笔记--基础知识

    基础知识 从去年开始就在计划中的three.js终于开始了 历史介绍 (摘自ijunfan1994的转载,感谢作者) OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于Op ...

  9. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

随机推荐

  1. Sql语句内功心法

    CREATE SCHEMA <模式名> AUTHORIZATION <用户名> 定义模式实际上定义了一个命名空间,在这个空间可以进一步定义该模式包含的数据库对象,例如基本表,视 ...

  2. 《JavaScript Dom 编程艺术》读书笔记-第4章

    我的前端入门第一本书是<JavaScript Dom 编程艺术>,网上查找资料发现前端的入门推荐书籍最受好评的就是这本和<JavaScript 高级程序设计>了.之所以先选这本 ...

  3. VBA定时执行某程序

    OnTime 方法参阅应用于示例特性安排一个过程在将来的特定时间运行(既可以是具体指定的某个时间,也可以是指定的一段时间之后). expression.OnTime(EarliestTime, Pro ...

  4. Javascript Canvas验证码

    用Canvas画的验证码,效果图如下 1.验证码的JS代码,保存到一个名称是validatedCode.js的文件内,代码如下: (function(window,document){ functio ...

  5. SQLserver触发器实现A表insert到B表

    CREATE TABLE tab1(tab1_id varchar(11));CREATE TABLE tab2(tab2_id varchar(11)); 现在我们有两张表,要实现在A表里面inse ...

  6. linux vi命令详解

    刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇. vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 ...

  7. 姿势估计实验-Realtime_Multi-Person_Pose_Estimation-CMU

    前言: 论文及源代码网址: https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation 地址2: https://github.com/ ...

  8. mql初学事物和视图

    1.概念:一条或者多条sql语句的集合! 事务:就是一堆操作的集合,他们同生共死.要么都执行成功,要么都执行失败 2.事务的特性 ACID A:原子性 完整的,不可分割的 原子性 (Atomicity ...

  9. Restful levels &HATEOAS基本介绍~

    本文所涉及的内容摘自:http://www.manongjc.com/article/93934.html 什么是RESTful REST这个词,是Roy Thomas Fielding在他2000年 ...

  10. ArcMap 图层无法编辑

    原因一.图层被其他程序占用 解决方法:关闭与之相关的程序与服务 原因二.没有开启编辑 解决方法:打开编辑器工具>>选项>>版本管理>>勾选或取消勾选编辑数据库版本并 ...