【问题标题】:Vectorize/optimize rolling pandas calculation on row向量化/优化行上的滚动熊猫计算
【发布时间】:2019-02-06 00:26:16
【问题描述】:

我有一个数据框:

df_dict = {
    'sum': np.nan,
    'src1': [5, 1, 1, 5, 1],
    'src2': [2, 6, 2, 4, 1]
}
df = pd.DataFrame(df_dict)

我目前正在通过以下方式更新“总和”列:

def transform(x):
    row_num = int(x.name)

    previous_sum = 0
    if row_num > 0:
        previous_sum = df.at[row_num-1,'sum']

    src1 = df.at[row_num,'src1']
    src2 = df.at[row_num,'src2']

    df.at[row_num,'sum'] = previous_sum - src2 + src1

df.apply( lambda x: transform(x), axis=1)

这会导致正确的输出:

   sum  src1  src2
0  3.0     5     2
1 -2.0     1     6
2 -3.0     1     2
3 -2.0     5     4
4 -2.0     1     1

问题在于包含许多行的大型数据框,并且在许多列中重复此操作非常慢。

如果可能的话,我想对其进行优化,以某种方式利用一些内置的 pandas/numpy 矢量化,或者任何更优化的解决方案。

我的例子在一个更好的解决方案

df['sum'] = df['sum'].shift() - df['src1'] + df['src2']

导致输出不正确

   sum  src1  src2
0  NaN     5     2
1  NaN     1     6
2  NaN     1     2
3  NaN     5     4
4  NaN     1     1

【问题讨论】:

    标签: python pandas dataframe lambda


    【解决方案1】:

    df['sum'] = df['src1'].cumsum() - df['src2'].cumsum().

    【讨论】:

    • 同理;只需从另一个中减去一个累积总和。
    • 感谢您的回答Macus,非常感谢
    • @AndreeCrist 如果我的回答有效,请接受。谢谢!
    【解决方案2】:

    看来您正在执行累积和。

    这可以通过cumsum()函数来实现

    df['sum'] = df['src'].cumsum()
    

    结果

    sum     src
    0   1   1
    1   3   2
    2   6   3
    3   10  4
    4   15  5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      相关资源
      最近更新 更多