我正在使用包含历史学生数据的 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
答案 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)