我对 Python 很陌生。非常感谢您的支持
我有两个 csv 文件,我正在尝试使用 Student_ID 列合并它们并创建一个新的 csv 文件。
csv 1 :每个条目都有一个唯一的学生 ID
Student_ID Age Course startYear
119 24 Bsc 2014
csv2:学生 ID 有多个记录,因为它为学生正在学习的每个科目都有一个新条目
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
我想合并两个 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
您可以使用pivot_table http://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html with join http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html:
注意:参数fill_value
代替NaN
to 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
EDIT:
需要自定义功能:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)