pandas的广播机制和运算

本文探讨了pandas中的广播机制,解释了如何使用该机制进行数据操作,如减去某一行或某一列。虽然基于numpy,但pandas的广播机制在处理数据时提供了便利。举例说明了当尝试减去一行时,所有行都会减去对应的第一行数据;而在减去一列时,由于索引不匹配,结果将返回NaN,除非有重复索引的列才会进行广播计算。

pandas的广播机制

pandas是基于numpy的,所以numpy的数据索引方法和运算函数在pandas中同样适用。pandas在计算时也具有广播机制,这使得计算很便捷。

pandas减去某一行

# 导包
import numpy as np
import pandas as pd 
# 随机数种子
rng=np.random.RandomState(256)
data=rng.randint(10,size=(5,5))

# 生成DataFrame
data1=pd.DataFrame(data=data,columns=list('ABCDE'))
data1
ABCDE
007109
156732
287464
320979
402098
# pandas所有行都减去某一行
data1-data1.iloc[0] # 中括号中只有一个维度时表示行
ABCDE
000000
15-163-7
28036-5
32-7870
40-5-19-1

所有行的数据都减去了第一行的对应数据。

pandas减去某一列

data1
ABCDE
007109
156732
287464
320979
402098
data1.iloc[:,0]
0    0
1    5
2    8
3    2
4    0
Name: A, dtype: int32
# 错误的做法
data1-data1.iloc[:,0]
ABCDE01234
0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

这样的结果都是NaN,在下面的案例中会看到原因

# 正确的做法
data1.subtract(data1.iloc[:,0],axis=0)
ABCDE
007109
1012-2-3
20-1-4-2-4
30-2757
402098
# 错误的做法,同上
data1.subtract(data1.iloc[:,0])
ABCDE01234
0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
  • 看完这个就明白为啥上面的做法是错误的了
# 取出某些值
data1.iloc[0,[1,3]]
B    7
D    0
Name: 0, dtype: int32
data1-data1.iloc[0,[1,3]]
ABCDE
0NaN0.0NaN0.0NaN
1NaN-1.0NaN3.0NaN
2NaN0.0NaN6.0NaN
3NaN-7.0NaN7.0NaN
4NaN-5.0NaN9.0NaN

B和D是两者有重复索引的列,所以元素少的会被广播。DataFrame中B和D列会相应减去B,D广播后的值。而没有重复索引的列将会是NaN。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python_xiaofeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值