亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Pandas 的算術運算

1. 前言

上一節我們學習了 Pandas 對重復數據的處理,主要對重復數據的檢測和刪除重復數據。除了對數據的單獨處理操作,數據之間的運算處理也是很有必要的,那 Pandas 中是否可以開展數據之間的算術運算呢?

Pandas 庫為方便數據處理,提供了強大而簡潔的算術運算操作,封裝了很多算術運算的函數供使用,本節課我們將學習 Pnadas 庫中提供的四種算術運算操作函數,包括 add (),sub (),div (),mul () 操作,因為 Series 和 DataFrame 之間的運算比較有代表性,針對每一個算術運算我們將以 Series 和 DataFrame 進行運算的實例進行講解。

2. 概述

Pandas 庫中的算術運算是數據集之間,根據索引進行運算的,如果存在不同的索引對,運算的結果是相同索引數據和不同索引數據的并集,并且用 NaN 填充運算結果。

當進行對應索引列之間的加減乘除運算時,要注意對應索引列之間的類型是否相同,如果不同類型進行運算時會報類型轉換錯誤,同時,要考慮到該類型是否能進行某種算術運算,比如字符串之間的加法運算是可以的,但是字符串之間是不存在減法、乘法和除法運算的,否則會報錯。

在正式講解各算術運算之前,我們先將 DataFrame 數據對象,通過 Excel 數據解析的方式進行創建,針對 Series 對象,在每次操作時,根據需要我們單獨再創建。

# 導入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第13小節/execl數據demo.xlsx"
# 解析數據
data = pd.read_excel(data_path)
print(data)

# --- DataFrame數據解析結果  ---
  編程語言   推出時間    價格                       主要創始人
0    java  199545.6               James Gosling
1  python  199167.0            Guido van Rossum
2       C  197233.9  Dennis MacAlistair Ritchie
3      js  199559.5                Brendan Eich
4     php  201269.9              Rasmus Lerdorf
5     C++  198375.0           Bjarne Stroustrup

3. add () 加法運算

add () 函數根據索引值,對相同索引的數據進行加法運算,注意字符串的加法是拼接操作。

# 創建 Series 對象
new_series = pd.Series(["11","22",33,"44"], index=['編程語言','推出時間','價格','last'])
print(new_series)
# --- 輸出結果 ---
編程語言    11
推出時間    22
價格      33
last    44
dtype: object

# data 為從 Excel 解析出的 DataFrame 對象
# 通過 add 函數進行加運算
new_result=data.add(new_series)
print(new_result)
# --- 輸出結果 ---
  last 主要創始人     價格     推出時間      編程語言
0  NaN   NaN   78.6  199522    java11
1  NaN   NaN    100  199122  python11
2  NaN   NaN   66.9  197222       C11
3  NaN   NaN   92.5  199522      js11
4  NaN   NaN  102.9  201222     php11
5  NaN   NaN    108  198322     C++11

輸出解析:new_series 對象中的 “last” 索引和 data 對象中 “主要創始人” 索引,他們之間不存在對應關系,而其他的索引是一一對應的,因此輸出結果其他的列均做了加法運算 (字符串是拼接,數值是相加),而這兩列則單獨加入到結果集中,并且用 NaN 進行填充。

如果我們的 Series 對象中的 “價格” 是字符型,在和 DataFrame 對象運算過程中就會報類型不匹配的錯誤。

# 創建 Series 對象
new_series = pd.Series(["11","22","33","44"], index=['編程語言','推出時間','價格','last'])
print(new_series)
# --- 輸出結果 ---
編程語言    11
推出時間    22
價格      33
last    44
dtype: object
    
# data 為從 Excel 解析出的 DataFrame 對象
# 通過 add 函數進行加運算
new_result=data.add(new_series)
print(new_result)
# --- 輸出結果 ---
……
TypeError: unsupported operand type(s) for +: 'float' and 'str'

輸出解析:因為我們的操作是在 data 數據集中加上 new_series 數據集,在 Pandas 中 str 類型加上任何類型相當于是字符串的拼接操作,而 int/float 類型值加上字符串,Pandas 不支持該算術運算,因此會報錯。

4. sub () 減法運算

sub () 函數用于數據集之間對應索引的減法操作,該操作不同于加法操作,字符操作是不存在減法操作的,算術上的減法只用于數值類型的數據運算,包括整形、浮點型等。

# 創建 Series 對象
new_series = pd.Series(['11',33], index=['推出時間','價格'])
print(new_series)
# --- 輸出結果 ---
推出時間    11
價格      33
dtype: object

# data 為從 Excel 解析出的 DataFrame 對象
# 通過 sub 函數進行減法運算
new_result=data.sub(new_series)
print(new_result)

# --- 輸出結果 ---
……
TypeError: unsupported operand type(s) for -: 'float' and 'str'
TypeError: unsupported operand type(s) for -: 'str' and 'str'

輸出解析:因為 pandas 中的 sub () 減法操作函數只在數值類型的數據之間有效,因此在 數值和字符串型,以及字符串與字符串之間進行 sub () 操作都會報錯。

下面我們只對兩個數據集的價格索引了列進行 sub () 操作。

# 創建 Series 對象
new_series = pd.Series([33], index=['價格'])
print(new_series)
# --- 輸出結果 ---
價格    33
dtype: int64

# data 為從 Excel 解析出的 DataFrame 對象
# 通過 sub 函數進行減法運算
new_result=data.sub(new_series)
print(new_result)
# --- 輸出結果 ---
  主要創始人  價格 推出時間 編程語言
0   NaN     12.6  NaN  NaN
1   NaN     34.0  NaN  NaN
2   NaN     0.9   NaN  NaN
3   NaN     26.5  NaN  NaN
4   NaN     36.9  NaN  NaN
5   NaN     42.0  NaN  NaN

輸出解析:這里我們對兩個數據集的價格列進行了相減操作,可以看到價格列的數據均減去了 33。

5. mul () 乘法運算

mul () 操作是兩個數據集對應索引列的數據進行乘法運算,該函數同樣只適用于兩個數值數據的運算,字符串之間,字符串與數值之間進行乘法運算均會報錯。

# 創建 Series 對象
new_series = pd.Series([3], index=['價格'])
print(new_series)
# --- 輸出結果 ---
價格    3
dtype: int64

# data 為從 Excel 解析出的 DataFrame 對象
# 通過 mul 函數進行乘法運算
new_result=data.mul(new_series)
print(new_result)
# --- 輸出結果 ---
  主要創始人  價格 推出時間 編程語言
0   NaN  136.8  NaN  NaN
1   NaN  201.0  NaN  NaN
2   NaN  101.7  NaN  NaN
3   NaN  178.5  NaN  NaN
4   NaN  209.7  NaN  NaN
5   NaN  225.0  NaN  NaN

輸出解析:通過乘法操作函數對兩個數據集的價格列進行操作,可以看到輸出結果中的價格均變為了以前的三倍,其他列以 NaN 進行填充。

6. div () 除法運算

div () 函數用于兩個數據集對應索引列的數據進行除法運算,該函數同樣只適用數值型數據之間的運算,并且除數不能為 0 ,否則會報錯。

# 創建 Series 對象
new_series = pd.Series([3,"fill"], index=['價格',"add_column"])
print(new_series)
# --- 輸出結果 ---
價格               3
add_column    fill
dtype: object

# data 為從 Excel 解析出的 DataFrame 對象
# 通過 div 函數進行除法運算,除數不能為0
new_result=data.div(new_series)
print(new_result)    
# --- 輸出結果 ---
    add_column 主要創始人  價格 推出時間 編程語言
0        NaN   NaN     15.2  NaN  NaN
1        NaN   NaN  22.3333  NaN  NaN
2        NaN   NaN     11.3  NaN  NaN
3        NaN   NaN  19.8333  NaN  NaN
4        NaN   NaN     23.3  NaN  NaN
5        NaN   NaN       25  NaN  NaN

輸出解析:通過 div () 函數進行兩個數據集價格列的除法運算,可以看到輸出結果原 data 集中的價格列數據均是除以 3 的結果,而其他的數列并入到結果集合中,并以 NaN 進行填充。

下面是除數為 0 時出現的錯誤結果:

# 創建 Series 對象
new_series = pd.Series([0,"fill"], index=['價格',"add_column"])
print(new_series)
# --- 輸出結果 ---
價格               0
add_column    fill
dtype: object

# data 為從 Excel 解析出的 DataFrame 對象
# 通過 div 函數進行除法運算,除數不能為0
new_result=data.div(new_series)
print(new_result)
# --- 輸出結果 ---
……
ZeroDivisionError: float division by zero

3. 小結

本節課程我們主要學習了 Pandas 中數據集之間進行的算術運算操作,主要講解了加、減、乘、除四種操作,算術運算并不是針對字符串類型的數據(在字符串之間的加法操作相當于是進行拼接操作),而是專門用來處理數值型數據的,因此對于不同的操作需要,要清晰的知道應該使用哪種操作函數去實現。本節課程的重點如下:

  • Pandas 庫算術運算加減乘除四種操作對應的操作函數的使用;
  • Pandas 庫算術運算函數使用時常見的錯誤原因;

圖片描述