给定以下熊猫数据框。
Firm Date Work_day
0 1 2016-11-17 1.0
1 1 2016-11-18 1.0
2 1 2016-11-19 0.0
3 1 2016-11-20 0.0
4 1 2016-11-21 1.0
5 1 2016-11-22 1.0
6 2 2016-12-21 0.0
7 2 2016-12-22 1.0
8 2 2016-12-23 0.0
9 2 2016-12-24 0.0
我将如何添加以下列"Last_working_day",它要么只是当前日期(如果Work_day == 1
(,要么给出"Work_day"值为1.0
的相应公司的最后一个 obs 的日期(Work_day 是这里工作日的虚拟变量(。因此,生成的表将如下所示。
Firm Date Work_day Last_working_day
0 1 2016-11-17 1.0 2016-11-17
1 1 2016-11-18 1.0 2016-11-18
2 1 2016-11-19 0.0 2016-11-18
3 1 2016-11-20 0.0 2016-11-18
4 1 2016-11-21 1.0 2016-11-21
5 1 2016-11-22 1.0 2016-11-22
6 2 2016-12-21 0.0 NaN
7 2 2016-12-22 1.0 2016-12-22
8 2 2016-12-23 0.0 2016-12-22
9 2 2016-12-24 0.0 2016-12-22
提前非常感谢!
我们使用Series.where
将所有日期转换为NaN
whereWork_day = 0
.
然后我们使用GroupBy.ffill
来填补每家公司的空白。
df['Last_working_day'] = df['Date'].where(df['Work_day'].eq(1))
df['Last_working_day'] = df.groupby('Firm')['Last_working_day'].ffill()
Firm Date Work_day Last_working_day
0 1 2016-11-17 1.0 2016-11-17
1 1 2016-11-18 1.0 2016-11-18
2 1 2016-11-19 0.0 2016-11-18
3 1 2016-11-20 0.0 2016-11-18
4 1 2016-11-21 1.0 2016-11-21
5 1 2016-11-22 1.0 2016-11-22
6 2 2016-12-21 0.0 NaN
7 2 2016-12-22 1.0 2016-12-22
8 2 2016-12-23 0.0 2016-12-22
9 2 2016-12-24 0.0 2016-12-22
请注意,Date
必须按升序排序(在本例中是这样(,否则必须事先排序:
df = df.sort_values('Date')
如果0
Work_day
,则用Series.mask
和上次调用GroupBy.ffill
替换日期时间:
#if necessary doering per groups
#df = df.sort_values(['Firm','Date'])
df['Last_working_day'] = df['Date'].mask(df['Work_day'].eq(0)).groupby(df['Firm']).ffill()
print (df)
Firm Date Work_day Last_working_day
0 1 2016-11-17 1.0 2016-11-17
1 1 2016-11-18 1.0 2016-11-18
2 1 2016-11-19 0.0 2016-11-18
3 1 2016-11-20 0.0 2016-11-18
4 1 2016-11-21 1.0 2016-11-21
5 1 2016-11-22 1.0 2016-11-22
6 2 2016-12-21 0.0 NaN
7 2 2016-12-22 1.0 2016-12-22
8 2 2016-12-23 0.0 2016-12-22
9 2 2016-12-24 0.0 2016-12-22