我有一个衡量学生成绩student
的数据框,如下所示:
ID TestDate PerformanceStatus (PS)
1 15/03/2016 0
1 01/04/2016 2
1 05/05/2016 1
1 07/06/2016 1
2 15/03/2016 0
2 01/04/2016 2
2 05/05/2016 1
2 07/06/2016 3
2 23/08/2016 1
我想更新我的表以获得一个新列PreviousPerformanceStatus。
此PreviousPerformanceStatus是根据监控的performanceStatus计算的,如下所示:
注意:如果在TestDate之前没有记录performanceStatus,我想制作PreviousPerformanceStatus = PerformanceStatus
ID TestDate PS PreviousPerformanceStatus
1 15/03/2016 0 0
1 01/04/2016 2 0
1 05/05/2016 1 2
1 07/06/2016 1 1
2 15/03/2016 0 0
2 01/04/2016 2 0
2 05/05/2016 1 2
2 07/06/2016 3 1
2 23/08/2016 1 3
我可以使用SQL语句来完成,但是如何使用pandas更新我的Dataframe。 感谢。
实施例: (对于ID = 1)previousPerformanceStatus是根据“早期”测试日期的PerformanceStatus计算的,所以当TestDate = 01/04 / 2016时,我想使用TestDate = 15/03/2016的数据。但是,如果我找不到任何先前的数据,我将使用PerformanceStatus中的值默认PreviousPerformanceStatus
答案 0 :(得分:2)
在groupby
上执行'ID'
并使用shift
和bfill
:
# Ensure that the dates are pd.Timestamp, and sorted.
df['TestDate'] = pd.to_datetime(df['TestDate'], dayfirst=True)
df = df.sort_values(by=['ID', 'TestDate'])
# Perform a shift and bfill at the 'ID' group level.
df['PrevPS'] = df.groupby('ID')['PS'].apply(lambda grp: grp.shift().bfill()).astype(int)
如果事先知道您的DataFrame将被正确排序,您可以跳过日期转换并排序。
结果输出:
ID TestDate PS PrevPS
0 1 2016-03-15 0 0
1 1 2016-04-01 2 0
2 1 2016-05-05 1 2
3 1 2016-06-07 1 1
4 2 2016-03-15 0 0
5 2 2016-04-01 2 0
6 2 2016-05-05 1 2
7 2 2016-06-07 3 1
8 2 2016-08-23 1 3