
本文介紹Pandas中的算術(shù)運算函數(shù)。
算術(shù)運算是最基本的運算,看起來很簡單,但也有一些需要注意的地方,本文中會依次介紹。
一、Pandas算術(shù)運算函數(shù)介紹
基本的算術(shù)運算是四則運算(加、減、乘、除)和乘方等。Pandas中都實現(xiàn)了對應(yīng)的算術(shù)運算函數(shù),如add()、sub()、mul()、div()等,常用的算術(shù)運算函數(shù)見下表。
| 算術(shù)運算函數(shù) | 用法介紹(以DataFrame為例)
| 描述 |
| add() | df1.add(df2) | df1與df2進行加法運算 |
radd()
| df1.radd(df2)
| df2與df1進行加法運算
|
sub()
| df1.sub(df2)
| 用df1減df2 |
rsub()
| df1.rsub(df2)
| 用df2減df1
|
mul()
| df1.mul(df2)
| df1與df2進行乘法運算
|
rmul()
| df1.rmul(df2)
| df2與df1進行乘法運算
|
div()
| df1.div(df2)
| 用df1除df2
|
rdiv()
| df1.rdiv(df2)
| 用df2除df1
|
truediv()
| df1.truediv(df2)
| 用df1除df2
|
rtruediv()
| df1.rtruediv(df2)
| 用df2除df1
|
floordiv()
| df1.floordiv(df2)
| 用df1除df2,取整除
|
rfloordiv()
| df1.rfloordiv(df2)
| 用df2除df1,取整除
|
| mod() | df1.mod(df2)
| 用df1除df2,取余數(shù)
|
| rmod() | df1.rmod(df2)
| 用df2除df1,取余數(shù)
|
| pow() | df1.pow(df2)
| 計算df1的df2次方,df1^df2 |
| rpow() | df1.rpow(df2)
| 計算df2的df1次方,df2^df1
|
在Pandas中,這些函數(shù)的用法和運算規(guī)則都相同,運算結(jié)果的數(shù)據(jù)結(jié)構(gòu)也都相同。所以本文中只以加法運算函數(shù)add()作為例子,使用其他函數(shù)時將函數(shù)名進行替換即可。如果有特殊的地方,會單獨說明。
二、DataFrame與數(shù)字的算術(shù)運算

DataFrame與數(shù)字相加時,會將DataFrame中的每一個數(shù)都與指定數(shù)字相加,返回一個新的DataFrame(不是修改原DataFrame,而是返回一個新的DataFrame)。
add()函數(shù)的作用與運算符“+”(加號)的作用一樣,運算結(jié)果也相同。其他算術(shù)運算函數(shù)與加法的用法一樣,也都可以用對應(yīng)的運算符代替。
在進行除法運算時,如果被除數(shù)是0,得到的結(jié)果可能是inf(表示無窮大,與Python的浮點數(shù)精度有關(guān)),也可能是NaN(空值)。在后面的所有運算中都一樣。
每一個算術(shù)運算函數(shù)都有一個r字母開頭的對應(yīng)函數(shù),起到的作用是交換運算數(shù)字的位置,如交換兩個加數(shù)的位置、交換被除數(shù)與除數(shù)的位置、交換底數(shù)與指數(shù)的位置。
三、Series與數(shù)字的算術(shù)運算

Series與數(shù)字相加時,與DataFrame相同,也是將Series中的每一個數(shù)都與指定數(shù)字相加,返回一個新的Series。
四、兩個DataFrame算術(shù)運算
1. 兩個形狀和索引相同的DataFrame進行運算

兩個DataFrame相加,如果DataFrame的形狀和對應(yīng)的索引都一樣,直接將對應(yīng)位置(按行索引和列索引確定位置)的數(shù)據(jù)相加,得到一個新的DataFrame。
2. 兩個形狀或索引不一樣的DataFrame進行運算

兩個DataFrame相加,如果DataFrame的形狀和索引不完全一樣,只會將兩個DataFrame中行索引和列索引對應(yīng)的數(shù)據(jù)相加,生成一個形狀能兼容兩個DataFrame的新DataFrame,在沒有運算結(jié)果的位置填充空值(NaN)。
當(dāng)且僅當(dāng)兩個DataFrame中都有值時,才會有運算結(jié)果,其他位置的結(jié)果都為空值,運算原理如下圖。

在運算結(jié)果中有很多空值,如果需要進行空值填充,可以使用fillna()函數(shù)。

fillna(value): 運算出結(jié)果后,將所有空值的位置都填充成指定值。
在算術(shù)運算函數(shù)中,可以使用fill_value參數(shù),在運算前先填充數(shù)據(jù)。

與fillna()函數(shù)不同,使用fill_value參數(shù)是先填充數(shù)據(jù)再進行運算,而fillna()函數(shù)是先運算再對結(jié)果填充,所以兩者的結(jié)果不一樣。
使用fill_value參數(shù)填充數(shù)據(jù)后再進行運算,如果兩個DataFrame中的數(shù)據(jù)都是填充值,則此位置的結(jié)果為空值,運算原理如下圖。

五、兩個Series算術(shù)運算
1. 兩個形狀和索引相同的Series進行運算

兩個Series相加,如果形狀和索引都一樣,直接將對應(yīng)位置(按行索引確定位置)的數(shù)據(jù)相加,得到一個新的Series。
2. 兩個形狀或索引不一樣的Series進行運算

兩個Series相加,如果形狀和索引不完全一樣,只會將行索引對應(yīng)的數(shù)據(jù)相加,生成一個形狀能兼容兩個Series的新Series,在沒有運算結(jié)果的位置填充空值(NaN)。

可以使用fillna()函數(shù)對運算結(jié)果中的空值進行填充。

可以使用fill_value參數(shù)先填充數(shù)據(jù)再進行運算。
與DataFrame不同的是,使用fill_value參數(shù)先填充數(shù)據(jù)再進行運算時,結(jié)果中不會有空值。因為Series是一維數(shù)據(jù),對Series填充時,不存在兩個Series都是填充值的行索引。
六、DataFrame與Series算術(shù)運算
1. Series的行索引與DataFrame的列索引相同

在Series與DataFrame進行算術(shù)運算時,默認(rèn)會將Series看成是一行數(shù)據(jù)(而不是一列),在add()函數(shù)中,axis參數(shù)默認(rèn)為1或'columns'。
如果Series的索引與DataFrame的列索引相同,會將Series依次與DataFrame中的每一行數(shù)據(jù)進行運算,得到一個新的DataFrame。
2. Series的行索引與DataFrame的行索引相同

如果Series的索引與DataFrame的行索引對應(yīng),要使Series按列與DataFrame運算,可以將axis參數(shù)設(shè)置成0或'index',這樣會將Series依次與DataFrame中的每一列數(shù)據(jù)進行運算,得到一個新的DataFrame。
3. Series的行索引與DataFrame的行索引或列索引不完全相同

此時,DataFrame與Series的運算原理同兩個DataFrame進行算術(shù)運算,會得到一個形狀能兼容DataFrame和Series的新DataFrame。其中Series可以按行運算,也可以按列運算,取決于axis參數(shù)。

fillna()函數(shù)的用法也一樣,對運算結(jié)果進行空值填充。
但是,DataFrame與Series的算術(shù)運算不支持fill_value參數(shù),不能先填充再運算,會報錯。
以上就是Pandas中的算術(shù)運算函數(shù)介紹,如果需要本文代碼,可以點擊關(guān)注公眾號“Python碎片”,然后在后臺回復(fù)“pandas07”關(guān)鍵字獲取完整代碼。