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)
您可以pivot_table使用join:
注意:参数fill_value替换NaN为0,如不需要则删除,默认聚合函数为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)
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |