如何合并两个关联DataFrame,使每位教师对应学生列表?
如何创建每位教师对应学生列表的DataFrame?
要实现每位教师对应一个学生列表的DataFrame,你可以用Pandas的分组和合并功能来完成,具体步骤如下:
步骤1:分组处理学生数据
先把学生表按教师姓名分组,将每个教师名下的所有学生数据转换成字典列表(每个字典代表一名学生的完整信息):
student_groups = student_df.groupby('teacher').apply(lambda x: x.to_dict('records')).reset_index(name='students')
步骤2:合并教师表与分组后的学生表
用左连接把教师表和分组后的学生表合并,确保所有教师都被保留(包括没有学生的教师),之后清理多余列并把空值替换为空列表:
# 合并两张表,按教师姓名匹配 result_df = teacher_df.merge(student_groups, left_on='name', right_on='teacher', how='left') # 删除重复的teacher列 result_df = result_df.drop('teacher', axis=1) # 给没有学生的教师填充空列表 result_df['students'] = result_df['students'].fillna([])
完整示例代码
如果你的数据还没定义,可以用下面的完整代码测试:
import pandas as pd # 构造教师DataFrame teacher_data = { 'name': ['Pep Guardiola', 'Jurgen Klopp', 'Mikel Arteta', 'Zinadine Zidane'], 'married': [True, True, False, True], 'school': ['Manchester High School', 'Liverpool High School', 'Arsenal High', pd.NA] } teacher_df = pd.DataFrame(teacher_data) # 构造学生DataFrame student_data = { 'teacher': ['Mikel Arteta', 'Mikel Arteta', 'Pep Guardiola', 'Jurgen Klopp', 'Jurgen Klopp', 'Jurgen Klopp', 'Pep Guardiola', 'Pep Guardiola', 'Mikel Arteta'], 'name': ['Bukayo Saka', 'Gabriel Martinelli', 'Jack Grealish', 'Roberto Firmino', 'Andrew Robertson', 'Darwin Nunez', 'Ederson Moraes', 'Manuel Akanji', 'Thomas Partey'], 'age': [21, 21, 27, 31, 28, 23, 29, 27, 29], 'height': ['2.1m']*9, 'weight': ['80kg', '75kg', '80kg', '65kg', '70kg', '75kg', '90kg', '80kg', '80kg'] } student_df = pd.DataFrame(student_data) # 分组处理学生数据 student_groups = student_df.groupby('teacher').apply(lambda x: x.to_dict('records')).reset_index(name='students') # 合并并整理结果 result_df = teacher_df.merge(student_groups, left_on='name', right_on='teacher', how='left').drop('teacher', axis=1) result_df['students'] = result_df['students'].fillna([]) # 打印结果 print(result_df)
输出结果
运行后会得到这样的DataFrame:
name married school students 0 Pep Guardiola True Manchester High School [{'teacher': 'Pep Guardiola', 'name': 'Jack Gr... 1 Jurgen Klopp True Liverpool High School [{'teacher': 'Jurgen Klopp', 'name': 'Roberto ... 2 Mikel Arteta False Arsenal High [{'teacher': 'Mikel Arteta', 'name': 'Bukayo S... 3 Zinadine Zidane True <NA> []
内容的提问来源于stack exchange,提问作者Adivhaho Mavhungu
相关产品推荐
相关产品推荐

