将2个csv数据集与Python合并为一个公共ID列 - 一个csv具有多个唯一ID记录

BA *_*stu 5 python csv merge pandas

我是Python的新手.非常感谢任何支持

我有两个csv文件,我正在尝试使用Student_ID列合并并创建一个新的csv文件.

csv 1:每个条目都有一个唯一的studentID

Student_ID    Age        Course       startYear
119           24         Bsc          2014
Run Code Online (Sandbox Code Playgroud)

csv2:有一个studentID的多条记录,因为它为学生正在服用的每个科目都有一个新条目

Student_ID            sub_name       marks      Sub_year_level
119                   Botany1        60         2
119                   Anatomy        70         2
119                   cell bio       75         3
129                   Physics1       78         2
129                   Math1          60         1 
Run Code Online (Sandbox Code Playgroud)

我想合并两个csv文件,以便我拥有来自csv1和新增的其他创建列的所有记录和列,我想从csv2获得每个学生每个subject_year_level的平均分数(必须计算).因此,最终的csv文件将在所有记录中具有唯一的Student_Ids

我希望我的新输出csv文件看起来像:

Student_ID  Age  Course  startYear  level1_avg_mark  levl2_avg_mark  levl3_avgmark
119         24   Bsc     2014       60               65              70
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 3

您可以pivot_table使用join

注意:参数fill_value替换NaN0,如不需要则删除,默认聚合函数为mean

df2 = df2.pivot_table(index='Student_ID',  \
                      columns='Sub_year_level',  \
                      values='marks', \
                      fill_value=0) \
         .rename(columns='level{}_avg_mark'.format)
print (df2)
Sub_year_level  level1_avg_mark  level2_avg_mark  level3_avg_mark
Student_ID                                                       
119                           0               65               75
129                          60               78                0

df = df1.join(df2, on='Student_ID')
print (df)
   Student_ID  Age Course  startYear  level1_avg_mark  level2_avg_mark  \
0         119   24    Bsc       2014                0               65   

   level3_avg_mark  
0               75  
Run Code Online (Sandbox Code Playgroud)

编辑:

需要自定义功能:

print (df2)
   Student_ID  sub_name  marks  Sub_year_level
0         119   Botany1      0               2
1         119   Botany1      0               2
2         119   Anatomy     72               2
3         119  cell bio     75               3
4         129  Physics1     78               2
5         129     Math1     60               1


f = lambda x:  x[x != 0].mean()
df2 = df2.pivot_table(index='Student_ID',columns='Sub_year_level', values='marks',aggfunc=f)
        .rename(columns='level{}_avg_mark'.format).reset_index()
print (df2)
Sub_year_level  Student_ID  level1_avg_mark  level2_avg_mark  level3_avg_mark
0                      119              NaN             72.0             75.0
1                      129             60.0             78.0              NaN
Run Code Online (Sandbox Code Playgroud)