python - 如何对依赖于前一行值相乘的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
编辑
在提到的贡献者中,我昨天的问题(如何将前一行的结果添加到当前行的内容?)是否与这个相同:确实,它们涵盖了不同的主题:在这个问题中,结果必须相乘,在另一个问题需要总结一下。
解决方案
我知道您正在寻求熊猫解决方案,但以下可能是一个不错的选择。一探究竟。我使用了列表(并在随机生成的 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})
干杯
推荐阅读
- wpf - 无法在画布内居中画布
- woocommerce - woocommerece 使用带有 woo 小部件的 wordpress 页面时,过滤器框不起作用
- flutter - 如何在 ElevatedButton 中的 OnPress 时调用多个反应/动作
- angular - 格式化 Angular 材质扩展 Google Places 自动完成美国地址
- mysql - 如何在分层表设计中拉动父母
- ios - 使用 UIDocumentPickerViewController 是否需要启用 iCloud 功能?
- ms-access - 我需要根据搜索日期范围内的数据生成报告
- symfony - 非公共路径上 Symfony 控制器中的 liipimagine_filter
- excel - 如果没有 SeleniumBasic,如何在 Excel 中使用 Selenium?
- php - 使用 image/png 标头缩放图像