Python: 反向求和运算的上采样

Python: upsampling with reverse-sum operation

我想对列数据帧重新采样 - 也就是说,我想在 sum() 样式操作的相反方向上对其进行上采样,假设每个点都是偶数。我并不特别关心最后一点的价值 - 对我来说,它是无关紧要的。

这是一个简单的版本:

   Input  Output
0   10.0    3.33
1    NaN    3.33
2    NaN    3.33
3   24.0    6.00
4    NaN    6.00
5    NaN    6.00
6    NaN    6.00
7   15.0   15.00

是否有 clean/pythonic 方法可以做到这一点?我还没有在重采样库中找到类似的东西,但在我拼凑出一个迭代解决方案之前想问问更有经验的人。

使用 groupbytransform mean:

df['Input'].fillna(0).groupby(df['Input'].notna().cumsum()).transform('mean')

0     3.333333
1     3.333333
2     3.333333
3     6.000000
4     6.000000
5     6.000000
6     6.000000
7    15.000000
Name: Input, dtype: float64

其中,

df['Input'].notna().cumsum()

0    1
1    1
2    1
3    2
4    2
5    2
6    2
7    3
Name: Input, dtype: int64

这里的想法是计算非空值的平均值,包括它后面的所有空单元格,并将结果广播回输入。我们需要在此处调用 fillna,因为 mean 默认会忽略 NaN。

来自 cs95 的好答案。这里用函数的形式也是一样的:

def reverse_sum(resampler):
    s = resampler.asfreq()
    return s.fillna(0).groupby(s.notna().cumsum()).transform('mean')

这使得 monkeypatch pandas 成为可能,因此它可以与 .resample():

一起使用
import pandas as pd
from pandas.core.resample import Resampler
setattr(pd.core.resample.Resampler, "reverse_sum", reverse_sum)

测试:

s = pd.Series([1, 2, -2], index=pd.period_range(start='2012-01-01', end='2012-01-03', freq='D'))
# 2012-01-01    1
# 2012-01-02    2
# 2012-01-03   -2

s.resample('12H').reverse_sum()

# 2012-01-01 00:00    0.5
# 2012-01-01 12:00    0.5
# 2012-01-02 00:00    1.0
# 2012-01-02 12:00    1.0
# 2012-01-03 00:00   -1.0
# 2012-01-03 12:00   -1.0