pandas对齐运算如何实现 pandas对齐运算实现代码

作者:袖梨 2022-06-25

pandas对齐运算如何实现?本篇文章小编给大家分享一下pandas对齐运算实现代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。

1.算术运算和数据对齐

import numpy as np
import pandas as pd

1.1 Series

a1 = pd.Series(np.arange(4),index=['a','b','c','d'])
a2 = pd.Series(np.arange(5),index=['a','r','c','u','k'])
print(a1)
print("="*20)
print(a2)

a 0

b 1

c 2

d 3

dtype: int32

====================

a 0

r 1

c 2

u 3

k 4

dtype: int32

有相同的索引值相加后结果变为浮点数,不相同则返回NAN值。

a1 + a2  

a 0.0

b NaN

c 4.0

d NaN

k NaN

r NaN

u NaN

dtype: float64

1.2 DataFrame

a3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['q','w','e','r'])
a4 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','u','c'],columns=['m','e','r'])
print(a3)
print("="*20)
print(a4)

q w e r

a 0 1 2 3

b 4 5 6 7

c 8 9 10 11

====================

m e r

a 0 1 2

u 3 4 5

c 6 7 8

只有行和列索引都相同的才能运算,否则返回NAN值

a3 + a4  

e m q r w

a3.0 NaNNaN 5.0NaN

bNaN NaNNaN NaNNaN

c17.0 NaNNaN 19.0NaN

uNaN NaNNaN NaNNaN

2.使用填充值的算术方法

2.1 Series

a1 = pd.Series(np.arange(4),index=['a','b','c','d'])
a2 = pd.Series(np.arange(5),index=['a','r','c','u','k'])
print(a1)
print("="*20)
print(a2)
print("="*20)
print(a1 + a2)    #有相同的索引值相加后结果变为浮点数,不相同索引值相加则返回NAN

a 0

b 1

c 2

d 3

dtype: int32

====================

a 0

r 1

c 2

u 3

k 4

dtype: int32

====================

a 0.0

b NaN

c 4.0

d NaN

k NaN

r NaN

u NaN

dtype: float64

使用填充值,不会返回NAN值,如果a1,a2的索引值相同则将对应的值作算术运算,如果不同则作为一行新的数据,形成一个新的Series索引

a1.add(a2,fill_value=0)  #a1+a2 忽略NAN影响

a 0.0

b 1.0

c 4.0

d 3.0

k 4.0

r 1.0

u 3.0

dtype: float64

2.2 DataFrame

a3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['q','w','e','r'])
a4 = pd.DataFrame(np.arange(9).reshape(3,3),index=['a','u','c'],columns=['m','e','r'])
print(a3)
print("="*20)
print(a4)
print("="*20)
print(a3 + a4)   #只有行索引和列索引都相同的才能运算,否则返回NAN

q w e r

a 0 1 2 3

b 4 5 6 7

c 8 9 10 11

====================

m e r

a 0 1 2

u 3 4 5

c 6 7 8

====================

e m q r w

a 3.0 NaN NaN 5.0 NaN

b NaN NaN NaN NaN NaN

c 17.0 NaN NaN 19.0 NaN

u NaN NaN NaN NaN NaN

只有当两个DataFrame索引独有的行和列独有的索引对应的值才返回NAN,例如下面的 b行m列返回NAN值,其索引值是由a3独有的b和a4独有的m组成的,行和列其中之一的索引值不是独有的,则返回对应DataFrame中的值,例如a行q列中的是a3,a4都有的,返回a3中 a行q列对应的值。

#使用填充值,
a3.add(a4,fill_value=0)  

e m q r w

a3.0 0.0 0.05.0 1.0

b6.0 NaN 4.07.0 5.0

c17.0 6.0 8.019.0 9.0

u4.0 3.0 NaN5.0 NaN

r 开头字母表示会翻转参数

1/a3

qwer

ainf1.0000000.5000000.333333

b0.2500.2000000.1666670.142857

c0.1250.1111110.1000000.090909

a3.rdiv(1)   #翻转div(除法),结果等同 1/a3

qwer

ainf1.0000000.5000000.333333

b0.2500.2000000.1666670.142857

c0.1250.1111110.1000000.090909

reindex指定索引和缺失值

将a3的列索引替换为a4的列索引 ,如果索引名字不相同,则返回NAN(不改变原DataFrame索引)

a3.reindex(columns=a4.columns))

mer

aNaN23

bNaN67

cNaN1011

#对NAN进行填充
a3.reindex(columns=a4.columns,fill_value=66)  #把所有的NAN替换为66(可指定任意值)

mer

a6623

b6667

c661011

3.DataFrame和Series混合运算

3.1 按行广播

arr = np.arange(12).reshape(3,4)
arr

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]])

取出第一行

arr[0] #取出第一行

array([0, 1, 2, 3])

每一行都减去第一行(按行进行广播)

arr - arr[0] #每一行都减去第一行(按行进行广播)

array([[0, 0, 0, 0],

[4, 4, 4, 4],

[8, 8, 8, 8]])

a3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['q','w','e','r'])
a3

qwer

a0123

b4567

c891011

位置索引 iloc[m,n] 第一个参数m表示行,第二个参数n表示列

s1 = a3.iloc[0]   #取出第一行
s1

q 0

w 1

e 2

r 3

Name: a, dtype: int32

每一行都减去第一行(按行进行广播)

a3-s1    #每一行都减去第一行(按行进行广播)

qwer

a0000

b4444

c8888

3.2 按列广播

取出q这一列

s2 = a3['q']  #取出q这一列
s2

a 0

b 4

c 8

Name: q, dtype: int32

默认是行axis=1,指定axis='index'或axis=0,按列进行广播(a3所有列分别减去第q列)

a3.sub(s2,axis='index')  #默认是行axis=1,指定axis='index'(或axis=0),按列进行广播(a3所有列分别减去第q列)

qwer

a0123

b0123

c0123

a3.sub(s2,axis=0)  #默认是行axis=1,指定axis=0(或)axis='index',按列进行广播(a3所有列分别减去第q列)

qwer

a0123

b0123

c0123

a3.sub(s2)  #默认情况 axis=1

abceqrw

aNaNNaNNaNNaNNaNNaNNaN

bNaNNaNNaNNaNNaNNaNNaN

cNaNNaNNaNNaNNaNNaNNaN

相关文章

精彩推荐