算术运算和数据对齐

Series和DataFrame中行运算和列运算有种特征叫做广播

在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。自动的数据对齐操作在不重叠的索引处引入了NA值,NA值在算术运算中过程中传播。

import pandas as pd
from pandas import Series
import numpy as np
s1 = Series([7.3,-2.5,3.4,1.5],index=['a','c','d','e'])
s2 = Series([-2.1,3.6,-1.5,4,3.1],index=['a','c','e','f','g'])
s1+s2 a 5.2
c 1.1
d NaN
e 0.0
f NaN
g NaN
dtype: float64

对于DataFrame,对齐操作会同时发生在行和列上。

df1 = pd.DataFrame(np.arange(9.).reshape(3,3),columns=['b','c','d'],index=['ohio','texas','colorado'])
df1 b c d
ohio 0.0 1.0 2.0
texas 3.0 4.0 5.0
colorado6.0 7.0 8.0
df2 = pd.DataFrame(np.arange(12.).reshape(4,3),columns=['b','d','e'],index=['utah','ohio','texas','oregon'])
df2 b d e
utah 0.0 1.0 2.0
ohio 3.0 4.0 5.0
texas 6.0 7.0 8.0
oregon 9.0 10.0 11.0 df1+df2
b c d e
coloradoNaN 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 = pd.DataFrame(np.arange(12.).reshape(3,4),columns=list('abcd'))
df2 = pd.DataFrame(np.arange(20.).reshape(4,5),columns=list('abcde'))
df1 a b c d
0 0.0 1.0 2.0 3.0
1 4.0 5.0 6.0 7.0
2 8.0 9.0 10.0 11.0
df2 a b c d e
0 0.0 1.0 2.0 3.0 4.0
1 5.0 6.0 7.0 8.0 9.0
2 10.0 11.0 12.0 13.0 14.0
3 15.0 16.0 17.0 18.0 19.0
df1+df2 a b c d e
0 0.0 2.0 4.0 6.0 NaN
1 9.0 11.0 13.0 15.0 NaN
2 18.0 20.0 22.0 24.0 NaN
3 NaN NaN NaN NaN NaN
### 这里面的fill_value=0不是指填充0,而是填充的值为0加上以前的值
df1.add(df2,fill_value=0)
a b c d e
0 0.0 2.0 4.0 6.0 4.0
1 9.0 11.0 13.0 15.0 9.0
2 18.0 20.0 22.0 24.0 14.0
3 15.0 16.0 17.0 18.0 19.0
### 重新索引的时候,fill_value的值是填充1
df1.reindex(columns=df2.columns,fill_value=1)
a b c d e
0 0.0 1.0 2.0 3.0 1
1 4.0 5.0 6.0 7.0 1
2 8.0 9.0 10.0 11.0 1
灵活的算术方法:
方法 说明
add +
sub -
div /
mul *

DataFrame和Series之间的运算

这就叫做广播,会传递下去的进行算术运算
arr = np.arange(12.).reshape(3,4)
arr
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
arr-arr[0]
array([[0., 0., 0., 0.],
[4., 4., 4., 4.],
[8., 8., 8., 8.]])

dataframe中


frame = pd.DataFrame(np.arange(12.).reshape(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
frame
b d e
utah 0.0 1.0 2.0
ohio 3.0 4.0 5.0
texas 6.0 7.0 8.0
oregon 9.0 10.0 11.0
# 先取utah行
series=frame.ix['utah']
b 0.0
d 1.0
e 2.0
Name: utah, dtype: float64 frame-series b d e
utah 0.0 0.0 0.0
ohio 3.0 3.0 3.0
texas 6.0 6.0 6.0
oregon 9.0 9.0 9.0 #如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集。
series2 = Series(range(3),index=['b','e','f'])
series2
frame+series2 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 # 如果你希望匹配列且在列上广播,则必须使用算术运算方法,axis = 0 代表列索引,axis=1代表行索引。
series3 = frame['d']
utah 1.0
ohio 4.0
texas 7.0
oregon 10.0
Name: d, dtype: float64
frame.sub(series3, axis=0) b d e
utah -1.0 0.0 1.0
ohio -1.0 0.0 1.0
texas -1.0 0.0 1.0
oregon -1.0 0.0 1.0

函数应用和映射

apply方法


frame = pd.DataFrame(np.arange(12.).reshape(4,3),columns = list('bde'),index=['utah','ohio','texas','oregon'])
frame b d e
utah 0.0 1.0 2.0
ohio 3.0 4.0 5.0
texas 6.0 7.0 8.0
oregon 9.0 10.0 11.0
# 默认操作列
f = lambda x:x.max()-x.min()
frame.apply(f) b 9.0
d 9.0
e 9.0
dtype: float64 # 指定操作行
frame.apply(f,axis=1) utah 2.0
ohio 2.0
texas 2.0
oregon 2.0
dtype: float64 # 如果都实现不了你要的需求,可以直接写函数
def f(x):
return Series([x.min(),x.max()],index=['min','max'])
frame.apply(f) b d e
min 0.0 1.0 2.0
max 9.0 10.0 11.0

applymap方法

# 还可以python函数的占位符使用,之所以叫applymap,是因为Series有一个应用于元素级函数的map方法
format = lambda x: '你好%s' % x
frame.applymap(format)
b d e
utah 你好0.0 你好1.0 你好2.0
ohio 你好3.0 你好4.0 你好5.0
texas 你好6.0 你好7.0 你好8.0
oregon 你好9.0 你好10.0 你好11.0 frame['d'].map(format)
utah 你好1.0
ohio 你好4.0
texas 你好7.0
oregon 你好10.0
Name: d, dtype: object

排序和排名

排序sort_index、sort_values

Series可以进行索引排序,默认进行升序,如果要降序排序,可以sort_index(ascending=False)

Series按值排序,sort_vlaues()

obj = Series(range(4),index=['d','c','a','b'])
obj
d 0
c 1
a 2
b 3
dtype: int64 obj.sort_index()
a 2
b 3
c 1
d 0
dtype: int64 obj.sort_index(ascending=False)
d 0
c 1
b 3
a 2
dtype: int64 obj.sort_values()
d 1
c 2
b 3
a 4
dtype: int64
# 降序
obj1.sort_values(ascending=False)
b 3
a 2
c 1
d 0
dtype: int64 # 在排序时,任何缺失值默认都会被放到Series的末尾 obj2 = Series([4,np.nan,7,np.nan,-2,1])
obj2.sort_values()
4 -2.0
5 1.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64

DataFrame可以进行索引排序,默认为行索引排序

frame=pd.DataFrame(np.arange(12).reshape(4,3),index=list('badc'),columns=[2,1,3])
frame 2 1 3
b 0 1 2
a 3 4 5
d 6 7 8
c 9 10 11
# 这里的axis为列排序
frame.sort_index(axis=1)
1 2 3
b 1 0 2
a 4 3 5
d 7 6 8
c 10 9 11 frame.sort_index()
2 1 3
a 3 4 5
b 0 1 2
c 9 10 11
d 6 7 8 # 在DataFrame上,你可以将一个或多个列的名字传递给by选项即可达到目的。
frame1 = pd.DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]}) frame1
b a
0 4 0
1 7 1
2 -3 0
3 2 1 frame1.sort_index(by='b')
b a
2 -3 0
3 2 1
0 4 0
1 7 1
frame1.sort_index(by=['a','b']) b a
2 -3 0
0 4 0
3 2 1
1 7 1

排名rank()

表示在这个数在原来的Series中排第几名,有相同的数,取其排名平均(默认)作为值


在obj中,4和4的排名是第4名和第五名,取平均得4.5。7和7的排名分别是第六名和第七名,则其排名取平均得6.5 obj4 = Series([7,-5,7,4,2,0,4])
obj4.rank() 0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64 # 根据值在源数据中出现的顺序进行排名
obj4.rank(method='first')
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64

Pandas基本功能之算术运算、排序和排名的更多相关文章

  1. pandas小记:pandas高级功能

    http://blog.csdn.net/pipisorry/article/details/53486777 pandas高级功能:面板数据.字符串方法.分类.可视化. 面板数据 {pandas数据 ...

  2. Pandas之Dataframe叠加,排序,统计,重新设置索引

    Pandas之Dataframe索引,排序,统计,重新设置索引 一:叠加 import pandas as pd a_list = [df1,df2,df3] add_data = pd.concat ...

  3. Pandas基本功能详解

    Pandas基本功能详解 Pandas  Pandas基本功能详解 |轻松玩转Pandas(2) 参考:Pandas基本功能详解 |轻松玩转Pandas(2)

  4. Pandas的排序和排名(Series, DataFrame) + groupby

    根据条件对数据集排序(sorting)也是一种重要的内置运算.要对行或列索引进行排序(按字典顺序), 可使用sort_index 方法, 它将返回一个已排序的新对象: 而DataFrame, 则可以根 ...

  5. Pandas常用功能总结

    1.读取.csv文件 df2 = pd.read_csv('beijingsale.csv', encoding='gb2312',index_col='id',sep='\t',header=Non ...

  6. Pandas基本功能之层次化索引及层次化汇总

    层次化索引 层次化也就是在一个轴上拥有多个索引级别 Series的层次化索引 data=Series(np.random.randn(10),index=[ ['a','a','a','b','b', ...

  7. Pandas基本功能之reindex重新索引

    重新索引 reindex重置索引,如果索引值不存在,就引入缺失值 参数介绍 参数 说明 index 用作索引的新序列 method 插值 fill_vlaue 引入缺失值时的替代NaN limit 最 ...

  8. Numpy - Pandas - Matplot 功能与函数名 速查

    用Python做数据分析,涉及到的函数实在是太多了,容易忘记,去网上查中文基本上差不到,英文有时候描述不清楚问题. 这里搞个针对个人习惯的函数汇总速查手册,下次需要用一个什么功能,就在这里面查到对应的 ...

  9. python使用easyinstall安装xlrd、xlwt、pandas等功能模块的方法

    在日常工作中,使用Python时经常要引入一些集成好的第三方功能模块,如读写excel的xlrd和xlwt模块,以及数据分析常用的pandas模块等. 原生的python并不含这些模块,在使用这些功能 ...

随机推荐

  1. 【Social listening实操】用大数据文本挖掘,来洞察“共享单车”的行业现状及走势

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 对于当下共享单车在互联网界的火热状况,笔者想从大数据文本挖 ...

  2. idea 添加代码自动提示支持,已PHP扩展 swoole 为例

    1,下载代码支持包 => swoole-ide-helper-en => https://github.com/eaglewu/swoole-ide-helper.git 2,如果安装了 ...

  3. javascript创建节点的事件绑定

    javascript创建节点的事件绑定 timeupdate事件是<video>中用来返回视频播放进度的事件,绑定在<video>标签返回视频播放位置(每秒计). 现video ...

  4. react-native android 权限问题

    初入reactNative 的一个坑 我是用的真机测试,没用安卓模拟器 第一次在安卓上打开应用,提示权限问题: Overlay permissions needs to be granted in o ...

  5. java中常用工具类

    目录 一. org.apache.commons.io.IOUtils 二. org.apache.commons.io.FileUtils 三. org.apache.commons.lang.St ...

  6. APP-8-文本语音

    1.百度语音合成JS文件 baidu_tts_cors.js /** * 浏览器调用语音合成接口 * @param {Object} param 百度语音合成接口参数 * 请参考 https://ai ...

  7. intellijIDEA Spring配置文件提示: File is included in 4 contexts

    前提: 不影响编码,但是出现淡黄色的背景 解决办法: 打开Project Structure —> 选择Modules -> 选择Spring ->先点减号把之前的都删除掉 -> ...

  8. Python的几种主流框架

    参考:https://www.cnblogs.com/linkenpark/p/5881586.html

  9. javascript:width,innerwidth和outerwidth的区别

    width()方法用于获得元素宽度 innerWidth()方法用于获得包括内边界(padding)的元素宽 outerWidth()方法用于获得包括内边界(padding)和边框(border)的元 ...

  10. colgroup中col定义表格单元格宽度

    colgroup中可以使用col来定义表格单元格宽度,可以使用像素(数字),百分比,我们来具体看看有什么不同. 先看一个最基本的:用像素(数字)表示,因为table有个宽度,这里表示占比 <ht ...