我有一个看起来像这样的数据框架:
df
Name date season binary
Apple 2016-04-24 MAM 1
Banana 2016-05-01 MAM 1
Berry 2016-05-01 MAM 1
Berry 2017-11-05 OND 1
Orange 2016-11-27 OND 1
Kiwi 2017-03-27 MAM 1
我有一个像这样一堆日期的长时间对象:
df1
date season Week
2016-03-28 MAM 13
2016-04-04 MAM 14
2016-04-11 MAM 15
2016-04-18 MAM 16
2016-04-25 MAM 17
2016-05-02 MAM 18
2016-05-09 MAM 19
2016-05-16 MAM 20
2016-05-23 MAM 21
2016-05-30 MAM 22
2016-06-06 MAM 23
2016-06-13 MAM 24
2016-10-03 OND 40
2016-10-10 OND 41
2016-10-17 OND 42
2016-10-24 OND 43
2016-10-31 OND 44
2016-11-07 OND 45
2016-11-14 OND 46
2016-11-21 OND 47
2017-03-13 MAM 11
2017-03-20 MAM 12
2017-03-27 MAM 13
2017-04-03 MAM 14
2017-04-10 MAM 15
2017-04-17 MAM 16
2017-04-24 MAM 17
2017-05-01 MAM 18
2017-05-08 MAM 19
2017-05-15 MAM 20
2017-05-22 MAM 21
2017-05-29 MAM 22
2017-06-19 MAM 25
2017-06-26 MAM 26
2017-07-03 MAM 27
2017-07-10 MAM 28
2017-07-17 MAM 29
2017-07-24 MAM 30
2017-07-31 MAM 31
2017-08-07 MAM 32
2017-08-14 MAM 33
2017-08-21 MAM 34
2017-08-28 MAM 35
2017-09-04 MAM 36
2017-09-11 MAM 37
2017-09-18 MAM 38
2017-09-25 MAM 39
2017-10-02 OND 40
2017-10-09 OND 41
2017-10-16 OND 42
2017-10-23 OND 43
2017-10-30 OND 44
2017-11-06 OND 45
2017-11-13 OND 46
2017-11-20 OND 47
其中 Week
是dtype:对象, date
是dtype:datetime64 [ns], season
is dtype:object。
我需要的有点复杂。我需要一种函数或算法,将df.date
识别为"结束日期",而df1.date
则是某些季节的"开始日期"。换句话说,df
中的" Apple"事件于2016-04-24启动,该事件由binary=1
指示。在新的数据框中,我需要包括2016-04-24之前的几周,但是在2016-03-28之后,并添加了一列,说binary=0
,因为该事件尚未发生。
凌乱的是,有四个季节:MAM 2016,OND 2016,MAM 2017和OND2017。以及每个df.date
的"开始日期"仅应在该赛季中考虑。
作为一个例子,这就是我想要得到的:
df_result
Name date season binary
Apple 2016-03-28 MAM 0
Apple 2016-04-04 MAM 0
Apple 2016-04-11 MAM 0
Apple 2016-04-18 MAM 0
Apple 2016-04-24 MAM 1
Banana 2016-03-28 MAM 0
Banana 2016-04-04 MAM 0
Banana 2016-04-11 MAM 0
Banana 2016-04-18 MAM 0
Banana 2016-04-25 MAM 0
Banana 2016-05-01 MAM 1
Berry 2016-03-28 MAM 0
Berry 2016-04-04 MAM 0
Berry 2016-04-11 MAM 0
Berry 2016-04-18 MAM 0
Berry 2016-04-25 MAM 0
Berry 2016-05-01 MAM 1
Berry 2017-10-02 OND 0
Berry 2017-10-09 OND 0
Berry 2017-10-16 OND 0
Berry 2017-10-23 OND 0
Berry 2017-10-30 OND 0
Berry 2017-11-05 OND 1
Orange 2016-10-03 OND 0
Orange 2016-10-10 OND 0
Orange 2016-10-17 OND 0
Orange 2016-10-24 OND 0
Orange 2016-10-31 OND 0
Orange 2016-11-07 OND 0
Orange 2016-11-14 OND 0
Orange 2016-11-21 OND 0
Orange 2016-11-27 OND 1
Kiwi 2017-03-13 MAM 0
Kiwi 2017-03-20 MAM 0
Kiwi 2017-03-27 MAM 1
总结start_end_dates
中的季节并使之更加清晰,这些日期是:
- MAM 2016:2016-03-28至2016-06-13
- OND 2016:2016-10-03至2016-11-21
- MAM 2017:2017-03-13至2017-09-25
- OND 2017:2017-10-02至2017-11-20
有了一些帮助,我知道我应该使用诸如df2 = df.reindex(start_end_dates)
之类的东西来固定 df
,但这并不能很好。
然后,我应该在df.date
之前的几周将名称分组,然后将空白填充为" 0"。所以也许:df3 = df3.loc[df3.groupby(level=0).binary.bfill().dropna().index].fillna(0).reset_index()
我已经看到了这个堆栈溢出问题,但它并没有完全回答我的问题:reindex pandas dataframe填写丢失的日期
非常感谢。
我们使用 merge_asof
df['Year']=df['date'].dt.year
df1['Year']=df1['date'].dt.year
A=[]
for x in range(len(df)):
Temp=pd.merge_asof(df1.sort_values('date'),df.sort_values('date').iloc[[x],:],on='date',by=['Year','season'],direction='forward',allow_exact_matches =False).dropna().drop('Week',1)
Temp.binary=np.nan
A.append(Temp)
A.append(df)
target=pd.concat(A).sort_values(['Name','date'])
target
Out[262]:
Name Year binary date season
0 Apple 2016 NaN 2016-03-28 MAM
1 Apple 2016 NaN 2016-04-04 MAM
2 Apple 2016 NaN 2016-04-11 MAM
3 Apple 2016 NaN 2016-04-18 MAM
0 Apple 2016 1.0 2016-04-24 MAM
0 Banana 2016 NaN 2016-03-28 MAM
1 Banana 2016 NaN 2016-04-04 MAM
2 Banana 2016 NaN 2016-04-11 MAM
3 Banana 2016 NaN 2016-04-18 MAM
4 Banana 2016 NaN 2016-04-25 MAM
1 Banana 2016 1.0 2016-05-01 MAM
0 Berry 2016 NaN 2016-03-28 MAM
1 Berry 2016 NaN 2016-04-04 MAM
2 Berry 2016 NaN 2016-04-11 MAM
3 Berry 2016 NaN 2016-04-18 MAM
4 Berry 2016 NaN 2016-04-25 MAM
2 Berry 2016 1.0 2016-05-01 MAM
47 Berry 2017 NaN 2017-10-02 OND
48 Berry 2017 NaN 2017-10-09 OND
49 Berry 2017 NaN 2017-10-16 OND
50 Berry 2017 NaN 2017-10-23 OND
51 Berry 2017 NaN 2017-10-30 OND
3 Berry 2017 1.0 2017-11-05 OND
20 Kiwi 2017 NaN 2017-03-13 MAM
21 Kiwi 2017 NaN 2017-03-20 MAM
5 Kiwi 2017 1.0 2017-03-27 MAM
12 Orange 2016 NaN 2016-10-03 OND
13 Orange 2016 NaN 2016-10-10 OND
14 Orange 2016 NaN 2016-10-17 OND
15 Orange 2016 NaN 2016-10-24 OND
16 Orange 2016 NaN 2016-10-31 OND
17 Orange 2016 NaN 2016-11-07 OND
18 Orange 2016 NaN 2016-11-14 OND
19 Orange 2016 NaN 2016-11-21 OND
4 Orange 2016 1.0 2016-11-27 OND