获取满足特定条件的最后一个观测值的日期



给定以下熊猫数据框。

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将所有日期转换为NaNwhereWork_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')

如果0Work_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

最新更新