我有以下df:
Week Sales
1 10
2 15
3 10
4 20
5 20
6 10
7 15
8 10
我想每3周分组一次,总结一下销售情况。我想从最差的3周开始。如果顶部只剩下不到3周的时间,则应忽略这些周。所需的输出如下:
Week Sales
5-3 50
8-6 35
我在我原来的df df.reset_index(drop=True).groupby(by=lambda x: x/N, axis=0).sum()
上尝试了这个方法,但是这个解决方案并不是从最底层开始的。
有谁能给我指个方向吗?谢谢!
发布于 2021-05-11 21:44:48
您可以尝试使用.iloc[::-1]
对数据进行反转
N=3
(df.iloc[::-1].groupby(np.arange(len(df))//N)
.agg({'Week': lambda x: f'{x.iloc[0]}-{x.iloc[-1]}',
'Sales': 'sum'
})
)
输出:
Week Sales
0 8-6 35
1 5-3 50
2 2-1 25
发布于 2021-05-11 23:11:02
在处理时段聚合时,我通常使用.resample
,因为它在将不同时段的数据打包时是可修复的
import io
from datetime import timedelta
import pandas as pd
dataf = pd.read_csv(io.StringIO("""Week Sales
1 10
2 15
3 10
4 20
5 20
6 10
7 15
8 10"""), sep='\s+',).astype(int)
# reverse data and transform int weeks to actual date time
dataf = dataf.iloc[::-1]
dataf['Week'] = dataf['Week'].map(lambda x: timedelta(weeks=x))
# set date object to index for resampling
dataf = dataf.set_index('Week')
# now we resample
dataf.resample('21d').sum() # 21days
::*注意:该标签具有误导性。而设置kind='period'
确实会引发错误
https://stackoverflow.com/questions/67488044
复制相似问题