我有一个熊猫数据框,看起来像
data = {
'Date': ['2024-07-14','2024-07-14','2024-07-14','2024-07-14','2024-07-14','2024-03-14','2024-03-14','2024-03-14','2024-02-14','2024-02-10','2024-02-10','2024-02-10','2024-04-13','2024-04-13','2023-02-11','2023-02-11','2023-02-11','2011-10-11','2011-05-02','2011-05-02'],
'Test_Number': [5,4,3,2,1,3,2,1,4,3,2,1,2,1,3,2,1,1,2,1],
'Student_ID': [2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1],
'Place': [3,5,7,3,1,9,6,3,7,8,2,1,3,4,2,1,5,6,2,7]
}
df = pd.DataFrame(data)
我想使用以下方法创建三个新列“student_rec_1”、“student_rec_2”、“student_rec_3”:
对于每个 Student_ID,student_rec_1 等于该学生在最近的最后一次考试中的成绩,如果不存在则等于 np.nan。
类似地,student_rec_2 等于该学生在最近一次日期的倒数第二次考试中的成绩,如果不存在则等于 np.nan,
student_rec_3 等于该学生在最近日期的倒数第三次考试中的排名,如果不存在则等于 np.nan。因此,期望的结果如下
data_new = {
'Date': ['2024-07-14','2024-07-14','2024-07-14','2024-07-14','2024-07-14','2024-03-14','2024-03-14','2024-03-14','2024-02-14','2024-02-10','2024-02-10','2024-02-10','2024-04-13','2024-04-13','2023-02-11','2023-02-11','2023-02-11','2011-10-11','2011-05-02','2011-05-02'],
'Test_Number': [5,4,3,2,1,3,2,1,4,3,2,1,2,1,3,2,1,1,2,1],
'Student_ID': [2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1],
'Place': [3,5,7,3,1,9,6,3,7,8,2,1,3,4,2,1,5,6,2,7],
'student_rec_1': [9,9,9,9,9,7,7,7,8,np.nan,np.nan,np.nan,2,2,6,6,6,2,np.nan,np.nan],
'student_rec_2': [6,6,6,6,6,8,8,8,2,np.nan,np.nan,np.nan,1,1,2,2,2,7,np.nan,np.nan],
'student_rec_3': [3,3,3,3,3,2,2,2,1,np.nan,np.nan,np.nan,5,5,7,7,7,np.nan,np.nan,np.nan]
}
df_new = pd.DataFrame(data_new)
这就是我尝试过的:
df['日期'] = pd.to_datetime(df['日期'])
df = df.sort_values(['日期', '测试编号'], 升序=[False, False])
def get_last_n_records(group,n):返回group['Place'].shift(-n)
df['student_rec_1'] = df.groupby('学生ID').apply(get_last_n_records, 1).reset_index(level=0, drop=True) df['student_rec_2'] = df.groupby('学生ID').apply(get_last_n_records, 2).reset_index(level=0, drop=True) df['student_rec_3'] = df.groupby('学生ID').apply(get_last_n_records, 3).reset_index(level=0, drop=True)
但它只是改变了每个学生的位置,并没有考虑到“最后一天”的因素,而且无论如何都会改变位置。