Python:使用逆和运算进行升采样

时间:2019-02-26 01:33:46

标签: python pandas dataframe resampling

我想对列数据帧重新采样-也就是说,我想以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

是否有一种干净/ pythonic的方法?我没有在重采样库中找到类似的东西,但是想在我找到一个迭代解决方案之前先问更多有经验的人。

2 个答案:

答案 0 :(得分:1)

通过groupby使用transformmean

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。

答案 1 :(得分:1)

来自 cs95 的好答案。这里以函数的形式表示:

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

这使得猴子补丁熊猫成为可能,因此它可以与.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