如何优化以下代码,使其对于具有很多行的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?)是否与此主题相同:的确,它们涵盖了不同的主题:在这个问题中,结果必须成倍增加,在另一个问题中,求和是必要的。
答案 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