标题到列,pandas DataFrame

问题描述 投票:0回答:1

例如,我有一个包含某个类测试结果的 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 中最好的方法是什么?预先感谢您!

python pandas string dataframe header
1个回答
0
投票

计算

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  
© www.soinside.com 2019 - 2024. All rights reserved.