我有一个包含3列的数据框。我正在尝试为行中的每个组查找不同的汇总值。
我正在使用jupyter笔记本运行它。还使用numpy之类的python库
例如,我原始的数据帧“ df”如下:
Name Subject Grade
0 Tom Math 20
1 Tom Sci 30
2 Tom Eng 10
3 Tom Math 40
4 John Math 30
我想计算学生参加特定考试的次数以及这两项考试的总分。
我按如下方式应用了groupby查询:
new_df = df.groupby(['Name', 'Subject']).agg({ 'Grade': np.sum, 'Subject': np.size})
但是,这仅导致了预期的2列。它确实以行的形式展示了每个学生的每门学科的总分。
我也尝试使用交叉表:
pd.crosstab(df.Name,df.Subject)
但是我不确定如何合并Sum的聚合功能。
我的预期输出如下:
Name Eng Math Sci GradeEng GradeMath GradeSci
0 John 0 30 0 0 1 0
1 Tom 10 60 30 1 2 1
答案 0 :(得分:3)
更多的是具有两个聚合函数的关键问题,
new_df = df.pivot_table(index = 'Name', columns = 'Subject', values = 'Grade', aggfunc = ['sum', 'size'], fill_value=0)\
.rename(columns = {'sum':'', 'size':'Grade'})
new_df.columns = new_df.columns.map(''.join)
new_df.reset_index(inplace = True)
Name Eng Math Sci GradeEng GradeMath GradeSci
0 John 0 30 0 0 1 0
1 Tom 10 60 30 1 2 1
使用groupby可以获得相同的结果,需要拆开数据框
df.groupby(['Name', 'Subject']).agg({ 'Grade': np.sum, 'Subject': np.size}).unstack().fillna(0).astype(int)
答案 1 :(得分:2)
只需修改您crosstab
,即可实现所需的功能
s=pd.crosstab(df.Name,df.Subject,values=df.Grade,aggfunc=['sum','count']).swaplevel(0,1,axis=1).fillna(0)
s.columns=s.columns.map(''.join)
s
Engsum Mathsum Scisum Engcount Mathcount Scicount
Name
John 0.0 30.0 0.0 0.0 1.0 0.0
Tom 10.0 60.0 30.0 1.0 2.0 1.0