首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用基于滚动自定义函数的Pandas向量法,涉及整行和先验数据

如何使用基于滚动自定义函数的Pandas向量法,涉及整行和先验数据
EN

Stack Overflow用户
提问于 2019-12-24 22:43:10
回答 1查看 128关注 0票数 1

虽然使用pandas滚动方法来应用标准公式很容易,但如果它涉及多列和有限的过去行,我发现很难。使用以下代码来更好地阐述:

代码语言:javascript
复制
import numpy as np
import pandas as pd

#create dummy pandas
df=pd.DataFrame({'col1':np.arange(0,25),'col2':np.arange(100,125),'col3':np.nan})

def func1(shortdf):
    #dummy formula 
    #use last row of col1 multiply by sum of col2
    return (shortdf.col1.tail(1).values[0]+shortdf.col2.sum())*3.14

for idx, i in df.iterrows():
    if idx>3:
        #only interested in the last 3 rows from position of dataframe
        df.loc[idx,'col3']=func1(df.iloc[idx-3:idx])

我目前使用的是iterrow方法,不用说,它非常慢。还有人有更好的建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-27 06:28:24

选项1

因此,shift是这里的解决方案。您必须使用滚动进行求和,然后在加法和乘法之后移位该级数。

代码语言:javascript
复制
df = pd.DataFrame({'col1':np.arange(0,25),'col2':np.arange(100,125),'col3':np.nan})

ans = ((df['col1'] + df['col2'].rolling(3).sum()) * 3.14).shift(1)

您可以使用ans.eq(df['col3'])检查ansdf['col3']是否相同。一旦您看到除了前几个是相同的,只需将ans更改为df['col3'],您就应该都设置好了。

选项2

如果没有关于自定义权重函数的额外信息,就很难提供帮助。但是,此选项可能是一种解决方案,因为它以使用更多内存为代价分离滚动计算。

代码语言:javascript
复制
# df['col3'] = ((df['col1'] + df['col2'].rolling(3).sum()) * 3.14).shift(1)

s = df['col2']

stride = pd.DataFrame([s.shift(x).values[::-1][:3] for x in range(len(s))[::-1]])
res = pd.concat([df, stride], axis=1)

# here you can perform your custom weight function
res['final'] = ((res[0] + res[1] + res[2] + res['col1']) * 3.14).shift(1)

stride是从this问题改编而来的,计算按行连接到原始数据帧。通过这种方式,每一列都有计算所需的值。

res['final']与选项1的ans相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59470364

复制
相关文章

相似问题

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