【问题标题】:How to sum values of a row of a pandas dataframe efficiently如何有效地对熊猫数据框的一行值求和
【发布时间】:2017-01-19 14:01:14
【问题描述】:

我有一个python dataframe,有 150 万行和 8 列。我想合并几列并创建一个新列。我知道如何做到这一点,但想知道哪个更快更高效。我在这里复制我的代码

import pandas as pd
import numpy as np
df=pd.Dataframe(columns=['A','B','C'],data=[[1,2,3],[4,5,6],[7,8,9]])

现在这是我想要实现的目标

df['D']=0.5*df['A']+0.3*df['B']+0.2*df['C']

另一种选择是使用熊猫的apply functionality

df['D']=df.apply(lambda row: 0.5*row['A']+0.3*row['B']+0.2*row['C'])

我想知道当我们有 150 万行并且必须组合 8 列时,哪种方法花费的时间更少

【问题讨论】:

  • 所以您基本上是在要求某人为您进行基准测试?
  • 是的,因为我直到现在才知道该怎么做。现在我知道存在类似 timeit 的东西。
  • 好吧,you could just Google it。 SO 既不是基准测试也不是谷歌搜索服务(尽管有些人会回答任何问题)。
  • @DavidArenburg- 如果您查看答案,这不仅仅是基准测试。有经验的人提供了替代计算方法,比我基准测试的方法有效

标签: python performance pandas numpy dataframe


【解决方案1】:

第一种方法更快,因为是矢量化的:

df=pd.DataFrame(columns=['A','B','C'],data=[[1,2,3],[4,5,6],[7,8,9]])
print (df)

#[30000 rows x 3 columns]
df = pd.concat([df]*10000).reset_index(drop=True)

df['D1']=0.5*df['A']+0.3*df['B']+0.2*df['C']
#similar timings with mul function
#df['D1']=df['A'].mul(0.5)+df['B'].mul(0.3)+df['C'].mul(0.2)

df['D']=df.apply(lambda row: 0.5*row['A']+0.3*row['B']+0.2*row['C'], axis=1)

print (df)

In [54]: %timeit df['D2']=df['A'].mul(0.5)+df['B'].mul(0.3)+df['C'].mul(0.2)
The slowest run took 10.84 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 950 µs per loop

In [55]: %timeit df['D1']=0.5*df['A']+0.3*df['B']+0.2*df['C']
The slowest run took 4.76 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 1.2 ms per loop

In [56]: %timeit df['D']=df.apply(lambda row: 0.5*row['A']+0.3*row['B']+0.2*row['C'], axis=1)
1 loop, best of 3: 928 ms per loop

另外测试1.5MsizeDataFrame,apply方法很慢:

#[1500000 rows x 6 columns]
df = pd.concat([df]*500000).reset_index(drop=True)

In [62]: %timeit df['D2']=df['A'].mul(0.5)+df['B'].mul(0.3)+df['C'].mul(0.2)
10 loops, best of 3: 34.8 ms per loop

In [63]: %timeit df['D1']=0.5*df['A']+0.3*df['B']+0.2*df['C']
10 loops, best of 3: 31.5 ms per loop

In [64]: %timeit df['D']=df.apply(lambda row: 0.5*row['A']+0.3*row['B']+0.2*row['C'], axis=1)
1 loop, best of 3: 47.3 s per loop

【讨论】:

    【解决方案2】:

    使用@jezrael 的设置

    df=pd.DataFrame(columns=['A','B','C'],data=[[1,2,3],[4,5,6],[7,8,9]])
    df = pd.concat([df]*30000).reset_index(drop=True)
    

    使用dot 产品的效率要高得多。

    np.array([[.5, .3, .2]]).dot(df.values.T).T
    

    时间

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 2020-10-02
      • 2019-10-06
      • 1970-01-01
      • 2017-10-21
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多