【Python】11招对比Pandas双列求和

公众号:尤而小屋

作者:Peter
编辑:Peter

大家好,我是Peter~

本文介绍的是通过11种方法来对比Pandas中DataFrame两列的求和

  • direct_add

  • for_iloc

  • iloc_sum

  • iat

  • apply(指定字段)

  • apply(针对整个DataFrame)

  • numpy_array

  • iterrows

  • zip

  • assign

  • sum

文末送书,文末送书,文末送书!

9d4c4cf322906e3d4e6ef59eb74277c7.png

数据模拟

为了效果明显,模拟了一份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
478ae49c3e8bcd9e8e1d36f127202729.png

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种函数,比较它们的速度:

60ad52a113fd3209d5ca0f99b9892fb1.png 27b0e406f2d5ef528def9141764ff291.png

统计每种方法下的均值,并整理成相同的us:

方法结果统一(us)
直接相加626us626
for + iloc9.61s9610000
iloc + sum1.42ms1420
iat9.2s9200000
apply(只取指定列)666ms666000
apply(全部列)697ms697000
numpy216us216
iterrows3.29s3290000
zip17.9ms17900
assign888us888
sum(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()
f19e1c0da6b9bef81d17e20cdf903b3b.png

从结果中能够看到:

  • for循环是最耗时的,使用numpy数组最省时间,相差4万多倍;主要是因为Numpy数组使用的向量化操作

  • sum函数(指定轴axis=1)对效果的提升很明显

总结:循环能省则省,尽可能用Pandas或者numpy的内置函数来解决。

 
 

6cfc2a163026c0814662ef65dc895f17.png

 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码

c0d967d8b288af934096ef9273c959cc.png

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值