我想对列数据帧重新采样-也就是说,我想以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的方法?我没有在重采样库中找到类似的东西,但是想在我找到一个迭代解决方案之前先问更多有经验的人。
答案 0 :(得分:1)
通过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。
答案 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