我有一个包含 3 列的数据框。我试图为行中的每个组找到不同的聚合值。
我正在使用 jupyter 笔记本来运行它。还使用 python 库,如 numpy
例如,我的原始数据框“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
最佳答案
它更多的是两个聚合函数的枢轴问题,
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可以得到相同的结果,你需要unstack dataframe
df.groupby(['Name', 'Subject']).agg({ 'Grade': np.sum, 'Subject': np.size}).unstack().fillna(0).astype(int)
关于sql - 计算 pandas 数据框中的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408605/