如何根据另一行更新Pandas数据帧?

时间:2017-02-16 17:59:44

标签: python-3.x pandas

我有一个衡量学生成绩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

1 个答案:

答案 0 :(得分:2)

groupby上执行'ID'并使用shiftbfill

# 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