首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在熊猫/ dataframe中执行下面的python操作?

如何在熊猫/ dataframe中执行下面的python操作?
EN

Stack Overflow用户
提问于 2020-11-05 16:53:09
回答 2查看 86关注 0票数 1

下面是我的数据

代码语言:javascript
复制
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行),执行此操作的最有效方法是什么?可以使用循环,但是它会非常,非常低效率。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-05 17:13:41

您希望每行的值都是具有随机值的后续行的乘积(对每个操作重新计算随机值)。你可以这样做:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
   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.
  • adds“值”重新计算为原始数据(对索引值进行赋值/连接,在添加到df之前不需要对系列进行排序)

作为理智检查,删除随机加权,并注意到这将减少为反向累积和操作:

代码语言:javascript
复制
values = df.sort_index(ascending=False)['Tval']
values = values.expanding().apply(sum)
df["values"] = values

如果迭代之间不需要更改权重,则可以使用类似的解决方案。正如另一种解决方案所建议的,你也可以预先计算所有随机权重,并取一个内积。这将导致内存效率低下,但速度可能要快得多,因为apply没有向量化。

票数 1
EN

Stack Overflow用户

发布于 2020-11-05 17:40:21

您正在执行的操作是一个点积,可以通过将权重设置为0来解释数据的递减使用。

代码语言:javascript
复制
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"]的第一个值,并对其余的值进行乘/和。就这样等等。

代码语言:javascript
复制
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.243747
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64701712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档