如何根据往年更改学生的历史年级水平?

时间:2021-06-25 03:56:30

标签: python pandas dataframe data-analysis

我正在使用包含历史学生数据的 Pandas 数据框。我有一个包含学生评估分数的列(来自以前的学年),一个包含分数来自日历年的列,以及一个包含学生当前(2020-2021)年级水平的列。我希望制作一个列,其中包含评估时学生的年级水平。问题是,并非所有学生的年级水平都是数字。我的成绩等级是 [PS, TK, K, 1, 2, 3, 4, 5, 6, 7, 8]。我可以写一堆条件“if”语句,但我很好奇是否有更快的方法。

我所拥有的样本:

   Student Score  Assessment Date   Current Grade Level
0  A              2017-2018         1    
1  B              2018-2019         1    
2  C              2019-2020         1    
3  B              2020-2021         1 

样本预期输出:

   Student Score  Assessment Date   Current Grade Level   Assessment Grade Level
0  A              2017-2018         1                     PS
1  B              2018-2019         1                     TK
2  C              2019-2020         1                     K
3  B              2020-2021         1                     1

1 个答案:

答案 0 :(得分:0)

让我们尝试使用 ordered CategoricalDtype

cat_type = pd.CategoricalDtype(["PS", "TK", "K", 1, 2, 3, 4, 5, 6, 7, 8],
                               ordered=True)
df['Current Grade Level'] = df['Current Grade Level'].astype(cat_type)

Assessment Date 获取正确的价值:

df['Assessment Date'].str.split('-').str[-1].astype(int)
0    2018
1    2019
2    2020
3    2021
Name: Assessment Date, dtype: int32

然后根据年份计算偏移量:

year = 2021  # or to get current year pd.Timestamp.now().year
s = year - df['Assessment Date'].str.split('-').str[-1].astype(int)

s

0    3
1    2
2    1
3    0
Name: Assessment Date, dtype: int32

然后根据该偏移量更新类别并转换回类别 pd.Categorical.from_codes

df['Assessment Grade Level'] = pd.Categorical.from_codes(
    df['Current Grade Level'].cat.codes - s,
    categories=cat_type.categories,
    ordered=True
)

df

  Student Score Assessment Date Current Grade Level Assessment Grade Level
0             A       2017-2018                   1                     PS
1             B       2018-2019                   1                     TK
2             C       2019-2020                   1                      K
3             B       2020-2021                   1                      1

完整的工作示例:

import pandas as pd

df = pd.DataFrame({
    'Student Score': ['A', 'B', 'C', 'B'],
    'Assessment Date': ['2017-2018', '2018-2019', '2019-2020',
                        '2020-2021'],
    'Current Grade Level': [1, 1, 1, 1]
})

cat_type = pd.CategoricalDtype(["PS", "TK", "K", 1, 2, 3, 4, 5, 6, 7, 8],
                               ordered=True)
df['Current Grade Level'] = df['Current Grade Level'].astype(cat_type)

year = 2021
s = year - df['Assessment Date'].str.split('-').str[-1].astype(int)
df['Assessment Grade Level'] = pd.Categorical.from_codes(
    df['Current Grade Level'].cat.codes - s,
    categories=cat_type.categories,
    ordered=True
)
print(df)