计算熊猫数据框中的不同值

时间:2019-03-28 23:58:16

标签: sql pandas jupyter-notebook

我有一个包含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

2 个答案:

答案 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