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 方法可以做到这一点?我还没有在重采样库中找到类似的东西,但在我拼凑出一个迭代解决方案之前想问问更有经验的人。
使用 groupby
和 transform
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
我想对列数据帧重新采样 - 也就是说,我想在 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 方法可以做到这一点?我还没有在重采样库中找到类似的东西,但在我拼凑出一个迭代解决方案之前想问问更有经验的人。
使用 groupby
和 transform
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