【发布时间】:2021-07-23 14:28:45
【问题描述】:
我有一个数据框 (mydf),其中每个组的日期按月频率显示,如下所示:
Dt Id Sales
2021-03-01 B 2
2021-04-01 B 42
2021-05-01 B 20
2021-06-01 B 4
2020-10-01 A 47
2020-11-01 A 67
2020-12-01 A 46
我想为每个组填写 dt,直到从 Id 日期开始的日期列中的最大日期,同时为销售列填写 0。因此,每个组都在自己的开始日期开始,但在相同的结束日期结束。
所以例如ID=A 将从 2020-10-01 开始一直到 2021-06-03,填充日期的值为 0。
所以输出将是
Dt Id Sales
2021-03-01 B 2
2021-04-01 B 42
2021-05-01 B 20
2021-06-01 B 4
2020-10-01 A 46
2020-11-01 A 47
2020-12-01 A 67
2021-01-01 A 0
2021-02-01 A 0
2021-03-01 A 0
2021-04-01 A 0
2021-05-01 A 0
2021-06-01 A 0
我尝试过重新索引,但我不想手动添加日期范围,而是想使用组中的日期。
我的代码是:
f = lambda x: x.reindex(pd.date_range('2020-10-01', '2021-06-01', freq='MS', name='Dt'))
mydf = mydf.set_index('Dt').groupby('Id').apply(f).drop('Id', axis=1).fillna(0)
mydf = mydf.reset_index()
【问题讨论】:
-
你的例子不是很清楚。您为 B 复制了“2021-06-01”,并且示例与文本描述不匹配(A 没有重新采样)。你能改进这个问题吗?
-
@mozway 输出中的 Id 被错误地复制了。现在清楚了吗?谢谢