例如,我有一个包含某个类测试结果的 pandas DataFrame。它可能看起来像这张表:
姓名 | 英语 | 法语 | 历史 | 数学 | 物理 | 化学 | 生物学 |
---|---|---|---|---|---|---|---|
迈克 | 3 | 3 | 4 | 5 | 6 | 5 | 4 |
汤姆 | 4 | 4 | 3 | 4 | 4 | 5 | 5 |
妮娜 | 5 | 6 | 4 | 3 | 3 | 3 | 5 |
安娜 | 4 | 3 | 4 | 5 | 5 | 3 | 3 |
穆萨 | 5 | 5 | 4 | 4 | 4 | 6 | 5 |
玛丽亚 | 4 | 3 | 5 | 4 | 3 | 2 | 3 |
克里斯 | 6 | 5 | 5 | 5 | 5 | 5 | 6 |
对于每个学生,我想创建至少两列具有最佳测试结果和最佳主题的列。重要提示:每个学生都可以拥有不止一门最好的科目(结果相似)!
对于上面的例子,它应该是这样的:
姓名 | 英语 | 法语 | 历史 | 数学 | 物理 | 化学 | 生物学 | 最好的结果 | 最佳科目1 | 最佳科目2 |
---|---|---|---|---|---|---|---|---|---|---|
迈克 | 3 | 3 | 4 | 5 | 6 | 5 | 4 | 6 | 物理 | 无 |
汤姆 | 4 | 4 | 3 | 4 | 4 | 5 | 5 | 5 | 化学 | 生物学 |
妮娜 | 5 | 6 | 4 | 3 | 3 | 3 | 5 | 6 | 法语 | 无 |
安娜 | 4 | 3 | 4 | 5 | 5 | 3 | 3 | 5 | 数学 | 物理 |
穆萨 | 5 | 5 | 4 | 4 | 4 | 6 | 5 | 6 | 化学 | 无 |
玛丽亚 | 4 | 3 | 5 | 4 | 3 | 2 | 3 | 5 | 历史 | 无 |
克里斯 | 6 | 5 | 5 | 5 | 5 | 5 | 6 | 6 | 英语 | 生物学 |
在 Pandas 中最好的方法是什么?预先感谢您!
在 Pandas 中最好的方法是什么?预先感谢您!
计算
Best Result
是任务中更简单的部分 - 只需将 max
应用于每一行(仅考虑主题列)。
要获得前两个最佳主题,您可以创建一个单独的函数来应用于每一行(现在包括所有主题列和最佳结果列)。在此函数中创建一个列表
best_subjects
,迭代所有科目并仅附加那些分数最好的科目。其中一个最好的主题是有保证的,第二个则不然 - 所以以防万一在最后附加 None
。 return pd.Series
使应用程序的结果成为一个数据帧,可以连接到原始数据帧。
def get_best_subjects(row):
best_result = row["Best Result"]
best_subjects = []
for name, score in row.items():
if name != "Best Result" and score == best_result:
best_subjects.append(name)
best_subjects.append(None)
return pd.Series({
"Best Subject 1": best_subjects[0],
"Best Subject 2": best_subjects[1]
})
subjects = df.columns[1:]
df["Best Result"] = df[subjects].apply(max, axis=1)
pd.concat([
df,
df[list(subjects.values) + ["Best Result"]].apply(get_best_subjects, axis=1)
], axis=1)
输出:
Name English French History Math Physic Chemistry Biology \
0 Mike 3 3 4 5 6 5 4
1 Tom 4 4 3 4 4 5 5
2 Nina 5 6 4 3 3 3 5
3 Anna 4 3 4 5 5 3 3
4 Musa 5 5 4 4 4 6 5
5 Maria 4 3 5 4 3 2 3
6 Chris 6 5 5 5 5 5 6
Best Result Best Subject 1 Best Subject 2
0 6 Physic None
1 5 Chemistry Biology
2 6 French None
3 5 Math Physic
4 6 Chemistry None
5 5 History None
6 6 English Biology