如何对依赖于前一行值的乘法的for循环进行泛化?

时间:2018-12-11 11:06:58

标签: python pandas

如何优化以下代码,使其对于具有很多行的DataFrames而言表现出色?如果可能的话,首选仅熊猫解决方案。

import pandas as pd
import numpy as np

CONSTANT = 1
df = pd.DataFrame({"a": [7, 2, 3], "c": [100, np.nan, np.NaN]})
df["d"] = np.nan

for runner in range(df.shape[0]):
    if runner > 0:
        df.loc[runner, "c"] = df.loc[runner - 1, "d"]
    df.loc[runner, "d"] = df.a.iloc[runner] * int(df.c.iloc[runner] * CONSTANT) + df.c.iloc[runner]

print("df:\n", df)

结果是:

df:
    a       c       d
0  7   100.0   800.0
1  2   800.0  2400.0
2  3  2400.0  9600.0

编辑

在提到的贡献者中,我昨天的问题(How to add result of previous row to contents of present row?)是否与此主题相同:的确,它们涵盖了不同的主题:在这个问题中,结果必须成倍增加,在另一个问题中,求和是必要的。

2 个答案:

答案 0 :(得分:0)

我知道您正在要求熊猫解决方案,但以下方法可能是一个不错的选择。一探究竟。我使用了列表(并在随机生成的1Mil数字上进行了测试,并且在普通笔记本电脑上只需几秒钟即可运行)。我相信使用列表会比df.loc快得多。

CONSTANT = 1
d, c = [], []
a = [7, 2, 3]
c.append(100)
d.append(c[0] * (a[0] * CONSTANT + 1))
for i in range(1, len(a)):
    d.append(d[i-1] * (a[i] * CONSTANT + 1))
c = c + [x for x in d[:-1]]
df = pd.DataFrame({"a":a, "c":c, "d":d})

欢呼

答案 1 :(得分:0)

您可以尝试这个;

col1 = [df.c.values[0]]
col2 = [(df.a.values[0] * df.c.values[0]) + df.c.values[0]]

for i in range(1, len(df.index)):
    col2.append(col2[i-1] + (df.a.values[i] * col2[i-1]))
    col1.append(col2[i-1])

df['c'] = col1
df['d'] = col2

   a       c       d
0  7   100.0   800.0
1  2   800.0  2400.0
2  3  2400.0  9600.0