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

Series

s1=Series([7.3,-,3.4,1.5],index=['a','c','d','e'])
s2=Series([-2.1,3.6,-1.5,,3.1],index=['a','c','e','f','g']) s1
Out[]:
a 7.3
c -25.0
d 3.4
e 1.5
dtype: float64 s2
Out[]:
a -2.1
c 3.6
e -1.5
f 4.0
g 3.1
dtype: float64

它们相加就会产生:

s1+s2
Out[]:
a 5.2
c -21.4
d NaN
e 0.0
f NaN
g NaN
dtype: float64

自动的数据对齐操作在不重叠的索引处引入了NA值。

DataFrame

对齐操作会同时发生在行和列上:

df1=DataFrame(np.arange().reshape((,)),columns=list('bcd'),
index=['Ohio','Texas','Colorado']) df2=DataFrame(np.arange().reshape((,)),columns=list('bde'),
index=['Utah','Ohio','Texas','Oregon']) df1
Out[]:
b c d
Ohio
Texas
Colorado df2
Out[]:
b d e
Utah
Ohio
Texas
Oregon

把它们相加后会返回一个新的DataFrame,其索引和列为原来那两个DataFrame的并集:

df1+df2
Out[]:
b c d e
Colorado NaN NaN NaN NaN
Ohio 3.0 NaN 6.0 NaN
Oregon NaN NaN NaN NaN
Texas 9.0 NaN 12.0 NaN
Utah NaN NaN NaN NaN
在算数方法中填充值
在对不同索引的对象进行算数运算时,你可能希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值:
df1=DataFrame(np.arange().reshape((,)),columns=list('abcd'))

df2=DataFrame(np.arange().reshape((,)),columns=list('abcde'))

df1
Out[]:
a b c d df2
Out[]:
a b c d e

将它们相加时,没有重叠的位置就会产生NA值:

df1+df2
Out[]:
a b c d e
0.0 2.0 4.0 6.0 NaN
9.0 11.0 13.0 15.0 NaN
18.0 20.0 22.0 24.0 NaN
NaN NaN NaN NaN NaN

使用df1的add方法,传入df2以及一个fill_value参数:

df1.add(df2,fill_value=)
Out[]:
a b c d e
0.0 2.0 4.0 6.0 4.0
9.0 11.0 13.0 15.0 9.0
18.0 20.0 22.0 24.0 14.0
15.0 16.0 17.0 18.0 19.0

与此类似,在对Series或DataFrame重新索引时,也可以指定一个填充值:

df1.reindex(columns=df2.columns,fill_value=)
Out[]:
a b c d e
灵活的算数方法
add ->用于加法(+)的方法
sub ->用于减法(-)的方法
div ->用于除法(/)的方法
mul ->用于乘法(*)的方法

DataFrame和Series之间的运算

arr=np.arange().reshape((,))

arr
Out[]:
array([[ , , , ],
[ , , , ],
[ , , , ]]) arr[]
Out[]: array([, , , ]) arr-arr[]
Out[]:
array([[, , , ],
[, , , ],
[, , , ]])

这就叫做广播(broadcasting)。DataFrame和Series之间的运算差不多如此:

frame=DataFrame(np.arange().reshape((,)),columns=list('bde'),
index=['Utah','Ohio','Texas','Oregon']) series=frame.ix[]
__main__:: DeprecationWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated frame
Out[]:
b d e
Utah
Ohio
Texas
Oregon series
Out[]:
b
d
e
Name: Utah, dtype: int32
匹配列,沿行进行广播
默认情况下,DataFrame和Series之间的算数运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播。
frame-series
Out[]:
b d e
Utah
Ohio
Texas
Oregon

也可以理解为纵向广播↓。

如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集:

series2=Series(range(),index=['b','e','f'])

frame+series2
Out[]:
b d e f
Utah 0.0 NaN 3.0 NaN
Ohio 3.0 NaN 6.0 NaN
Texas 6.0 NaN 9.0 NaN
Oregon 9.0 NaN 12.0 NaN
 
匹配行在列上广播
则必须使用算数运算方法:
series3=frame['d']

frame
Out[]:
b d e
Utah
Ohio
Texas
Oregon series3
Out[]:
Utah
Ohio
Texas
Oregon
Name: d, dtype: int32 frame.sub(series3,axis=)
Out[]:
b d e
Utah -
Ohio -
Texas -
Oregon -

传入的轴号就是希望匹配的轴。

可以理解为横向广播 →

pandas读书笔记 算数运算和数据对齐的更多相关文章

  1. Shell学习笔记——算数运算与条件测试

    算数运算 1. 使用let命令 #!/sbin/bash var1=2 var2=3 let sum=var1+var2 echo $sum 使用let命令式,变量前不需要加$号 只用于整数运算,不适 ...

  2. 《利用python进行数据分析》读书笔记--第七章 数据规整化:清理、转换、合并、重塑(三)

    http://www.cnblogs.com/batteryhp/p/5046433.html 5.示例:usda食品数据库 下面是一个具体的例子,书中最重要的就是例子. #-*- encoding: ...

  3. 《利用python进行数据分析》读书笔记--第六章 数据加载、存储与文件格式

    http://www.cnblogs.com/batteryhp/p/5021858.html 输入输出一般分为下面几类:读取文本文件和其他更高效的磁盘存储格式,加载数据库中的数据.利用Web API ...

  4. 《统计推断(Statistical Inference)》读书笔记——第6章 数据简化原理

    在外行眼里统计学家经常做的一件事就是把一大堆杂七杂八的数据放在一起,算出几个莫名其妙的数字,然后再通过这些数字推理出貌似很靠谱的结论,简直就像是炼金术士用“贤者之石”把一堆石头炼成了金矿.第六章,应该 ...

  5. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中数据文件空间使用与管理

    1.表和索引存储结构 在SQL Server2005以前,一个表格是以一个B树或者一个堆(heap)存放的.每个B树或者堆,在sysindexes里面都有一条记录相对应.SQL Server2005以 ...

  6. OCA读书笔记(10) - 管理UNDO数据

    Undo自动管理与手动管理 undo段自动管理SQL> show parameter undo_management 将undo段改为手工管理SQL> alter system set u ...

  7. MySQL必知必会 读书笔记三:检索数据和数据排序

    检索数据 SELECT语句 它的用途是从一个或多个表中检索信息. 为了使用SELECT检索表数据,必须至少给出两条信息--想选择什 么,以及从什么地方选择. 检索单个列 SELECT col_1 FR ...

  8. $《第一行代码:Android》读书笔记——第6章 数据持久化

    主要讲述了Android数据持久化的三种方式:文件存储.SharedPreference存储.SQLite数据库存储. (一)文件存储 其实Android中文件存储方式和Java的文件操作类似,就是用 ...

  9. 3D数学读书笔记——向量运算及在c++上的实现

     本系列文章由birdlove1987编写.转载请注明出处.     文章链接: http://blog.csdn.net/zhurui_idea/article/details/24782661   ...

随机推荐

  1. 【原生】js实现表格的增删改查

    说在前面的,写给小白白的,大神请绕道~ 今天用原生js写一下动态表格的增删改查,主要是熟悉一下js的DOM操作. 首先,做一个表格,用来显示提交的数据,如图下: 此处,我添加了编号.姓名.密码.生日. ...

  2. ionic3.0 alipay-base插件移除后会添加多余的链接文件在nodes-modules中,导致再安装其他插件或移除插件时报错问题

    1.报错截图: 2.如图因为nodes-module 文件夹中有多余的链接文件导致报错. 3.解决方法:将该链接文件删除即可.

  3. web框架express学习一

    服务端 node app.jsapp.jslet express = require("express"); let http = require("http" ...

  4. leetcode-161周赛-1250-检查好数组

    题目描述: 唯一的结论是如果数组中所有数的最大公约数为 1,则存在解,否则不存在.所以只需要计算所有数最大公约数即可,时间复杂度O(nlog(m)),其中 m 为数字大小. class Solutio ...

  5. TCP三次挥手

    tcp:三次握手 client和server之间需要经历三次握手才能建立连接(connnect()方法中封装了三次握手的步骤)syn:同步请求,建立连接的请求ack:对syn请求包的确认 应答syn: ...

  6. 区间dp(二维)——cf1199F

    复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ...

  7. BZOJ 2055: 80人环游世界(有上下界的费用流)

    题面 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 693 Solved: 434 [Submit][Status][Discuss] Descript ...

  8. js 读取本地文件(必须通过input控件才能实现) 及 下载文件

    js 操作 文件的实现原理: 1.js是不能直接操作(读写)文件的,html的  input[type="file"] 控件是可以读取文件数据(获取文件数据流)的.js可以获取这个 ...

  9. JAVA并发工具类---------------(CountDownLatch和CyclicBarrier)

    CountDownLatch是什么 CountDownLatch,英文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进 ...

  10. (转)ubuntu 下安装mysql5.5.30的过程以及遇到的问题

    转:http://blog.chinaunix.net/uid-27103408-id-3280584.html 由于实验需要安装mysql,当然我们可以通过sudo apt-get install ...