公眾號:尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
本文介紹的是通過11種方法來對比Pandas中DataFrame兩列的求和
direct_add
for_iloc
iloc_sum
iat
apply(指定字段)
apply(針對整個DataFrame)
numpy_array
iterrows
zip
assign
sum
文末送書,文末送書,文末送書!
為了效果明顯,模擬了一份5萬條的數據,4個字段:
import pandas as pd
import numpy as np
data = pd.DataFrame({
"A":np.random.uniform(1,1000,50000),
"B":np.random.uniform(1,1000,50000),
"C":np.random.uniform(1,1000,50000),
"D":np.random.uniform(1,1000,50000)
})
data
下面是通過11種不同的函數來實現A、C兩列的數據相加求和E列
把df的兩列直接相加
In [3]:
def fun1(df):
df["E"] = df["A"] + df["C"]
for語句 + iloc方法的遍歷循環
In [4]:
def fun2(df):
for i in range(len(df)):
df["E"] = df.iloc[i,0] + df.iloc[i, 2] # iloc[i,0]定位A列的數據
iloc方法針對全部行指定列的求和:
0:第一列A
2:第三列C
In [5]:
def fun3(df):
df["E"] = df.iloc[:,[0,2]].sum(axis=1) # axis=1表示在列上操作
for語句 + iat定位,類比於for + iloc
In [6]:
def fun4(df):
for i in range(len(df)):
df["E"] = df.iat[i,0] + df.iat[i, 2]
apply方法 ,僅僅取出AC兩列
In [7]:
def fun5(df):
df["E"] = df[["A","C"]].apply(lambda x: x["A"] + x["C"], axis=1)
針對前部的DataFrame使用apply方法
In [8]:
def fun6(df):
df["E"] = df.apply(lambda x: x["A"] + x["C"], axis=1)
使用numpy數組解決
In [9]:
def fun7(df):
df["E"] = df["A"].values + df["C"].values
iterrows()迭代每行的數據
In [10]:
def fun8(df):
for _, rows in df.iterrows():
rows["E"] = rows["A"] + rows["C"]
通過zip函數現將AC兩列的數據進行壓縮
In [11]:
def fun9(df):
df["E"] = [i+j for i,j in zip(df["A"], df["C"])]
通過派生函數assign生成新的字段E
In [12]:
def fun10(df):
df.assign(E = df["A"] + df["C"])
在指定的A、C兩列上使用sum函數
In [13]:
def fun11(df):
df["E"] = df[["A","C"]].sum(axis=1)
調用11種函數,比較它們的速度:
統計每種方法下的均值,並整理成相同的us:
result = pd.DataFrame({"methods":["direct_add","for_iloc","iloc_sum","iat","apply_part","apply_all",
"numpy_arry","iterrows","zip","assign","sum"],
"time":[626,9610000,1420,9200000,666000,697000,216,3290000,17900,888,1330]})
result
進行降序後的可視化:
result.sort_values("time",ascending=False,inplace=True)
import plotly_express as px
fig = px.bar(result, x="methods", y="time", color="time")
fig.show()
從結果中能夠看到:
for循環是最耗時的,使用numpy數組最省時間,相差4萬多倍;主要是因為Numpy數組使用的向量化操作
sum函數(指定軸axis=1)對效果的提升很明顯
總結:循環能省則省,盡可能用Pandas或者numpy的內置函數來解決。
往期精彩回顧
適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯機器學習交流qq群955171419,加入微信群請掃碼
demjson-2.2.41. Recently, when
p{margin:10px 0}.markdown-body