下面是我的数据
df = pd.DataFrame({
'Year': [2021, 2022, 2023, 2024, 2025],
'Tval' : [1, 9, 8, 1, 6]
})我想要创建一个输出的新列,如附图中所示。
一个乘法器(2.3、1.2、1.3、2.6和1.13)是随机生成的。同样,对于第二张和第三张。
作为原问题的简化版本(超过30k行),执行此操作的最有效方法是什么?可以使用循环,但是它会非常,非常低效率。

发布于 2020-11-05 17:13:41
您希望每行的值都是具有随机值的后续行的乘积(对每个操作重新计算随机值)。你可以这样做:
values = df.sort_index(ascending=False)['Tval']
values = values.expanding().apply(lambda x: np.sum(x*np.random.random(size=len(x))))
df["values"] = values结果:
Year Tval values
0 2021 1 10.342499
1 2022 9 15.595990
2 2023 8 11.491088
3 2024 1 5.447966
4 2025 6 3.689064解释:
expanding对第一个索引的所有行进行操作,最后一个expanding()对大于或相等的索引行进行随机加权。权重将每个iteration.。
作为理智检查,删除随机加权,并注意到这将减少为反向累积和操作:
values = df.sort_index(ascending=False)['Tval']
values = values.expanding().apply(sum)
df["values"] = values如果迭代之间不需要更改权重,则可以使用类似的解决方案。正如另一种解决方案所建议的,你也可以预先计算所有随机权重,并取一个内积。这将导致内存效率低下,但速度可能要快得多,因为apply没有向量化。
发布于 2020-11-05 17:40:21
您正在执行的操作是一个点积,可以通过将权重设置为0来解释数据的递减使用。
weights = np.random.rand(5, 5)
weights = np.tril(weights)
print(weights)
[[0.80446016 0. 0. 0. 0. ]
[0.38560755 0.45014049 0. 0. 0. ]
[0.61068876 0.91918189 0.66418596 0. 0. ]
[0.78442001 0.63551564 0.35635216 0.14712083 0. ]
[0.54315584 0.20083916 0.28262627 0.01919842 0.58714358]]点积将是weights的第一行,乘以df["Tval"]的值,然后将每一项乘积之和。然后它将接受weights的第2行并执行相同的操作,但是由于我们将第二行的第一个值设置为0,我们实际上将忽略df["Tval"]的第一个值,并对其余的值进行乘/和。就这样等等。
df["value"] = df["Tval"] @ weights
print(df)
Year Tval value
0 2021 1 19.181775
1 2022 9 11.324420
2 2023 8 7.936429
3 2024 1 5.792162
4 2025 6 5.243747https://stackoverflow.com/questions/64701712
复制相似问题