def func_i1_o2_rolling_solution1(x):
output_1 = np.max(x)
output_2 = np.min(x)
# Last index is where to place the final values: x.index[-1]
df.at[x.index[-1], ['m', 'n']] = output_1, output_2
return 0
df['m'], df['n'] = (np.nan, np.nan)
df['b'].rolling(2).apply(func_i1_o2_rolling_solution1, raw=False)
def func_i1_o2_rolling_groupby(x):
output_1 = np.max(x)
output_2 = np.min(x)
# Last index is where to place the final values: x.index[-1]
df.at[x.index[-1], ['q', 'r']] = output_1, output_2
return 0
df['q'], df['r'] = (np.nan, np.nan)
df.groupby('group')['b'].rolling(2).apply(func_i1_o2_rolling_groupby, raw=False).reset_index(drop=True)
重要注意事项
代码示例
让我们首先创建一个dataframe,它将在下面的所有示例中使用,包括groupby示例的group列。 对于滚动窗口和多个输入/输出列,我在下面的所有代码示例中仅使用2,但显然,这可以是任意数字>;1.
它将如下所示:
输入1列,输出1列
基础
滚动
Roling&;Groupby
将重置索引解决方案(见上文注释)添加到滚动功能中
输入2列,输出1列
基础
滚动
如上文注释第2点所述,2个输入没有“正常”解决方案。下面的解决方法使用“raw=False”来确保输入是pd.Series,这意味着我们还可以得到值旁边的索引。这使我们能够从其他列中以正确的索引获取要使用的值
滚动&;Groupby
将重置索引解决方案(见上文注释)添加到滚动功能中
输入1列,输出2列
基础
您可以通过返回pd系列来使用“正常”解决方案:
或者你也可以使用zip/元组组合,这大约快8倍
滚动
正如上面注释中第1点所解释的,如果我们想在使用滚动&;时返回超过1个值,我们需要一种变通方法;组合应用。我找到了两个有效的解决方案
1
优点:一切都在一个函数内完成。
Cons:您必须先创建列,因为它不使用raw输入,所以创建列的速度较慢
2
优点:它使用原始输入,使速度提高一倍左右。由于它不使用索引来设置输出值,代码看起来更清晰(至少在我看来)。
缺点:您必须自己创建nan前缀,这需要更多的代码行。
滚动&;Groupby
通常,我会使用上面更快的第二种解决方案。但是,因为我们组合组和滚动这意味着您必须手动设置楠/零点(取决于组的数量)在数据集中的某个地方的右边的索引。在我看来,当组合滚动、groupby和多个输出列时,第一个解决方案更容易,并自动解决自动NAN/分组问题。最后,我再次使用reset_索引解决方案
输入2列,输出2列
基础
我建议使用与i1_o2相同的“快速”方式,唯一的区别是您可以使用两个输入值
滚动
由于我使用了一个变通方法来应用与多个输入的滚动,并且我使用了另一个变通方法来应用与多个输出的滚动,您可以猜到我需要将它们组合在一起进行此操作。
1.使用索引从其他列获取值(请参见func_i2_o1_滚动)
2.在正确的索引上设置最终的多个输出(请参见func_i1_o2_rolling_solution1)
滚动&;Groupby
将重置索引解决方案(见上文注释)添加到滚动功能中
相关问题 更多 >
编程相关推荐