首页 > 解决方案 > 如何对依赖于前一行值相乘的for循环进行pandadize?

问题描述

如何优化以下代码,使其对具有大量行的 DataFrame 具有相当的性能?如果可能,首选熊猫专用解决方案。

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

编辑

在提到的贡献者中,我昨天的问题(如何将前一行的结果添加到当前行的内容?)是否与这个相同:确实,它们涵盖了不同的主题:在这个问题中,结果必须相乘,在另一个问题需要总结一下。

标签: pythonpandas

解决方案


我知道您正在寻求熊猫解决方案,但以下可能是一个不错的选择。一探究竟。我使用了列表(并在随机生成的 100 万个数字上进行了测试,它在普通笔记本电脑上运行几秒钟)。我相信使用列表会比 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})

干杯


推荐阅读