我的数据如下:
date id value
2017-01-01 1 1
2017-01-01 2 1
2017-01-02 1 3
2017-01-03 1 6
2017-02-15 1 1
2017-02-17 1 5
2017-02-18 1 8
2017-02-19 1 3
我想按如下方式对其进行累加:对于每个日期,请汇总接下来两周内所有行并对值进行求和。数据集中没有重叠,日期组的间距非常稀疏。
对于上面的示例,结果将是:
date id value
2017-01-01 1 9
2017-01-01 2 1
2017-02-15 1 17
如何在pandas数据框中执行此操作?
我已经尝试了以下方法,但它没有成功:
df = df.groupby(pd.Grouper(key='date', freq='14d', axis=1))['value'].sum().reset_index()
这使用了2周的固定滚动窗口,而我希望始终在数据的第一天开始。如果窗口边界位于中间,则此方法可以将批次拆分为两个。另外,我无法确定如何将Grouper日期分组与正常分组相结合,以便考虑key
列。
答案 0 :(得分:0)
根据您想要的结果,您似乎希望将本月上半月或下半月的值相加。
import pandas as pd
创建样本
df = pd.DataFrame({
"date": [
"2017-01-01", "2017-01-01", "2017-01-02", "2017-01-03",
"2017-02-15", "2017-02-17", "2017-02-18", "2017-02-19",
],
"id": [1, 2, 1, 1, 1, 1, 1, 1],
"value": [1, 1, 3, 6, 1, 5, 8, 3],
})
整天减少至1或15
df["date"] = pd.to_datetime(df["date"]).apply(
lambda x: x.replace(day=1) if x.day < 15 else x.replace(day=15)
)
groupby.sum以获取日期和ID
df.groupby(["date", "id"]).value.sum().reset_index()