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))
data1=pd.DataFrame(data=data,columns=list('ABCDE'))
data1
| A | B | C | D | E |
|---|
| 0 | 0 | 7 | 1 | 0 | 9 |
|---|
| 1 | 5 | 6 | 7 | 3 | 2 |
|---|
| 2 | 8 | 7 | 4 | 6 | 4 |
|---|
| 3 | 2 | 0 | 9 | 7 | 9 |
|---|
| 4 | 0 | 2 | 0 | 9 | 8 |
|---|
data1-data1.iloc[0]
| A | B | C | D | E |
|---|
| 0 | 0 | 0 | 0 | 0 | 0 |
|---|
| 1 | 5 | -1 | 6 | 3 | -7 |
|---|
| 2 | 8 | 0 | 3 | 6 | -5 |
|---|
| 3 | 2 | -7 | 8 | 7 | 0 |
|---|
| 4 | 0 | -5 | -1 | 9 | -1 |
|---|
所有行的数据都减去了第一行的对应数据。
pandas减去某一列
data1
| A | B | C | D | E |
|---|
| 0 | 0 | 7 | 1 | 0 | 9 |
|---|
| 1 | 5 | 6 | 7 | 3 | 2 |
|---|
| 2 | 8 | 7 | 4 | 6 | 4 |
|---|
| 3 | 2 | 0 | 9 | 7 | 9 |
|---|
| 4 | 0 | 2 | 0 | 9 | 8 |
|---|
data1.iloc[:,0]
0 0
1 5
2 8
3 2
4 0
Name: A, dtype: int32
data1-data1.iloc[:,0]
| A | B | C | D | E | 0 | 1 | 2 | 3 | 4 |
|---|
| 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
这样的结果都是NaN,在下面的案例中会看到原因
data1.subtract(data1.iloc[:,0],axis=0)
| A | B | C | D | E |
|---|
| 0 | 0 | 7 | 1 | 0 | 9 |
|---|
| 1 | 0 | 1 | 2 | -2 | -3 |
|---|
| 2 | 0 | -1 | -4 | -2 | -4 |
|---|
| 3 | 0 | -2 | 7 | 5 | 7 |
|---|
| 4 | 0 | 2 | 0 | 9 | 8 |
|---|
data1.subtract(data1.iloc[:,0])
| A | B | C | D | E | 0 | 1 | 2 | 3 | 4 |
|---|
| 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
| 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
|---|
data1.iloc[0,[1,3]]
B 7
D 0
Name: 0, dtype: int32
data1-data1.iloc[0,[1,3]]
| A | B | C | D | E |
|---|
| 0 | NaN | 0.0 | NaN | 0.0 | NaN |
|---|
| 1 | NaN | -1.0 | NaN | 3.0 | NaN |
|---|
| 2 | NaN | 0.0 | NaN | 6.0 | NaN |
|---|
| 3 | NaN | -7.0 | NaN | 7.0 | NaN |
|---|
| 4 | NaN | -5.0 | NaN | 9.0 | NaN |
|---|
B和D是两者有重复索引的列,所以元素少的会被广播。DataFrame中B和D列会相应减去B,D广播后的值。而没有重复索引的列将会是NaN。