程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python】11招對比Pandas雙列求和

編輯:Python

公眾號:尤而小屋

作者: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種函數

下面是通過11種不同的函數來實現A、C兩列的數據相加求和E列

方法1:直接相加

把df的兩列直接相加

In [3]:

def fun1(df):
    df["E"] = df["A"] + df["C"]

方法2:for+iloc定位

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列的數據

方法3:iloc + sum

iloc方法針對全部行指定列的求和:

  • 0:第一列A

  • 2:第三列C

In [5]:

def fun3(df):
    df["E"] = df.iloc[:,[0,2]].sum(axis=1)  # axis=1表示在列上操作

方法3:iat定位

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函數(只讀兩列)

apply方法 ,僅僅取出AC兩列

In [7]:

def fun5(df):
    df["E"] = df[["A","C"]].apply(lambda x: x["A"] + x["C"], axis=1)

apply函數(全部df)

針對前部的DataFrame使用apply方法

In [8]:

def fun6(df):
    df["E"] = df.apply(lambda x: x["A"] + x["C"], axis=1)

numpy數組

使用numpy數組解決

In [9]:

def fun7(df):
    df["E"] = df["A"].values + df["C"].values

iterrows迭代

iterrows()迭代每行的數據

In [10]:

def fun8(df):
    for _, rows in df.iterrows():
        rows["E"] = rows["A"] + rows["C"]

zip函數

通過zip函數現將AC兩列的數據進行壓縮

In [11]:

def fun9(df):
    df["E"] = [i+j for i,j in zip(df["A"], df["C"])]

assign函數

通過派生函數assign生成新的字段E

In [12]:

def fun10(df):
    df.assign(E = df["A"] + df["C"])

sum函數

在指定的A、C兩列上使用sum函數

In [13]:

def fun11(df):
    df["E"] = df[["A","C"]].sum(axis=1)

結果

調用11種函數,比較它們的速度:

統計每種方法下的均值,並整理成相同的us:

方法結果統一(us)直接相加626us626for + iloc9.61s9610000iloc + sum1.42ms1420iat9.2s9200000apply(只取指定列)666ms666000apply(全部列)697ms697000numpy216us216iterrows3.29s3290000zip17.9ms17900assign888us888sum(axis=1)1.33ms1330
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,加入微信群請掃碼


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved