【发布时间】:2018-06-14 16:33:37
【问题描述】:
我有一个数据框df,可以用这个来创建:
data={'id':[1,1,1,1,2,2,2,2],
'date1':[datetime.date(2016,1,1),datetime.date(2016,1,2),datetime.date(2016,1,3),datetime.date(2016,1,4),
datetime.date(2016,1,2),datetime.date(2016,1,4),datetime.date(2016,1,3),datetime.date(2016,1,1)],
'date2':[datetime.date(2016,1,5),datetime.date(2016,1,3),datetime.date(2016,1,5),datetime.date(2016,1,5),
datetime.date(2016,1,4),datetime.date(2016,1,5),datetime.date(2016,1,4),datetime.date(2016,1,1)],
'score1':[5,7,3,2,9,3,8,3],
'score2':[1,3,0,5,2,20,7,7]}
df=pd.DataFrame.from_dict(data)
And looks like this:
id date1 date2 score1 score2
0 1 2016-01-01 2016-01-05 5 1
1 1 2016-01-02 2016-01-03 7 3
2 1 2016-01-03 2016-01-05 3 0
3 1 2016-01-04 2016-01-05 2 5
4 2 2016-01-02 2016-01-04 9 2
5 2 2016-01-04 2016-01-05 3 20
6 2 2016-01-03 2016-01-04 8 7
7 2 2016-01-01 2016-01-01 3 7
我需要做的是为每个score1 和score2 创建一个列,根据usedate 是否介于date1 和 date2。 usedate 是通过获取介于 date1 最小值和 date2 最大值之间的所有日期创建的。我用它来创建日期范围:
drange=pd.date_range(df.date1.min(),df.date2.max())
生成的数据框 newdf 应如下所示:
usedate score1sum score2sum
0 2016-01-01 8 8
1 2016-01-02 21 6
2 2016-01-03 32 13
3 2016-01-04 30 35
4 2016-01-05 13 26
为了澄清,在 usedate 2016-01-01 上,score1sum 是 8,这是通过查看 df 中的行计算得出的,其中 2016-01-01 介于 date1 和 @987654340 之间并包括在内@,将 row0(5) 和 row8(3) 相加。在usedate 2016-01-04 上,score2sum 是 35,这是通过查看 df 中的行计算得出的,其中 2016-01-04 介于 date1 和 date2 之间,包括 date2,它们总和 row0( 1)、row3(0)、row4(5)、row5(2)、row6(20)、row7(7)。
也许是某种groupby,或者melt,然后是groupby?
【问题讨论】:
-
你是从 0 还是从 1 开始计算行数?您的第二个示例存在混淆。在第一个示例中,我没有看到 row8 是 3。回到第二个示例,
2016-01-04为何介于2017-05-28 and 2017-09-22和2015-11-01 and 2015-11-09之间? -
另外,你的最小日期(
df.date1.min())是2015-11-01,你的usedate栏怎么能从2016-01-01开始? -
@Fatih Akici,非常抱歉。我用更少的日期重新创建了示例数据框,却忘记了更改我最初拥有的内容。我已经用正确的示例更新了问题。
标签: python pandas dataframe pandas-groupby melt