gpt4 book ai didi

python - pandas 基于值而不是计数的窗口滚动计算

转载 作者:IT老高 更新时间:2023-10-28 20:45:06 25 4
gpt4 key购买 nike

我正在寻找一种方法来执行类似于 pandas 的各种 rolling_* 函数的方法,但我希望滚动计算的窗口由值范围(例如,DataFrame 列的值范围),而不是窗口中的行数。

举个例子,假设我有这个数据:

>>> print d
RollBasis ToRoll
0 1 1
1 1 4
2 1 -5
3 2 2
4 3 -4
5 5 -2
6 8 0
7 10 -13
8 12 -2
9 13 -5

如果我执行 rolling_sum(d, 5) 之类的操作,我会得到一个滚动总和,其中每个窗口包含 5 行。但我想要的是一个滚动总和,其中每个窗口都包含一定范围的 RollBasis 值。也就是说,我希望能够执行 d.roll_by(sum, 'RollBasis', 5) 之类的操作,并获得一个结果,其中第一个窗口包含 RollBasis 的所有行 介于 1 和 5 之间,则第二个窗口包含 RollBasis 介于 2 和 6 之间的所有行,然后第三个窗口包含 RollBasis 介于两者之间的所有行3 和 7 等。窗口的行数不相等,但在每个窗口中选择的 RollBasis 值的范围是相同的。所以输出应该是这样的:

>>> d.roll_by(sum, 'RollBasis', 5)
1 -4 # sum of elements with 1 <= Rollbasis <= 5
2 -4 # sum of elements with 2 <= Rollbasis <= 6
3 -6 # sum of elements with 3 <= Rollbasis <= 7
4 -2 # sum of elements with 4 <= Rollbasis <= 8
# etc.

我不能用 groupby 做到这一点,因为 groupby 总是产生不相交的组。我不能用滚动函数来做到这一点,因为它们的窗口总是按行数滚动,而不是按值滚动。那我该怎么做呢?

最佳答案

我认为这是你想要的:

In [1]: df
Out[1]:
RollBasis ToRoll
0 1 1
1 1 4
2 1 -5
3 2 2
4 3 -4
5 5 -2
6 8 0
7 10 -13
8 12 -2
9 13 -5

In [2]: def f(x):
...: ser = df.ToRoll[(df.RollBasis >= x) & (df.RollBasis < x+5)]
...: return ser.sum()

上述函数采用一个值,在本例中为 RollBasis,然后根据该值索引数据框列 ToRoll。返回的系列由满足 RollBasis + 5 标准的 ToRoll 值组成。最后,对该系列求和并返回。

In [3]: df['Rolled'] = df.RollBasis.apply(f)

In [4]: df
Out[4]:
RollBasis ToRoll Rolled
0 1 1 -4
1 1 4 -4
2 1 -5 -4
3 2 2 -4
4 3 -4 -6
5 5 -2 -2
6 8 0 -15
7 10 -13 -20
8 12 -2 -7
9 13 -5 -5

玩具示例 DataFrame 的代码,以防其他人想尝试:

In [1]: from pandas import *

In [2]: import io

In [3]: text = """\
...: RollBasis ToRoll
...: 0 1 1
...: 1 1 4
...: 2 1 -5
...: 3 2 2
...: 4 3 -4
...: 5 5 -2
...: 6 8 0
...: 7 10 -13
...: 8 12 -2
...: 9 13 -5
...: """

In [4]: df = read_csv(io.BytesIO(text), header=0, index_col=0, sep='\s+')

关于python - pandas 基于值而不是计数的窗口滚动计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14300768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com