Python pandas:同时对不同列进行平均值和总和

问题描述 投票:0回答:3

我有一个 pandas 数据框,如下所示:

Name    Missed    Credit    Grade
A       1         3         10
A       1         1         12      
B       2         3         10
B       1         2         20

我想要的输出是:

Name    Sum1   Sum2    Average
A       2      4      11
B       3      5      15   

基本上是获得列

Credit
Missed
的总和并对
Grade
求平均值。我现在正在做的是
Name
上的两个 groupby,然后获取总和和平均值,最后合并两个输出数据帧,这似乎不是执行此操作的最佳方法。我也在 SO 上发现了这一点,如果我只想在一个专栏上工作,这是有意义的:

df.groupby('Name')['Credit'].agg(['sum','average'])

但不确定如何为两列都做一行行?

python pandas
3个回答
87
投票

您需要

agg
dictionary
,然后
rename
列名称:

d = {'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}
df=df.groupby('Name').agg({'Missed':'sum', 'Credit':'sum','Grade':'mean'}).rename(columns=d)
print (df)
      Sum1  Sum2  Average
Name                     
A        2     4       11
B        3     5       15

如果还想从

Name
创建列:

df = (df.groupby('Name', as_index=False)
       .agg({'Missed':'sum', 'Credit':'sum','Grade':'mean'})
       .rename(columns={'Missed':'Sum1', 'Credit':'Sum2','Grade':'Average'}))
print (df)
  Name  Sum1  Sum2  Average
0    A     2     4       11
1    B     3     5       15

具有命名聚合的解决方案:

df = df.groupby('Name', as_index=False).agg(Sum1=('Missed','sum'), 
                                            Sum2= ('Credit','sum'),
                                            Average=('Grade','mean'))
print (df)
  Name  Sum1  Sum2  Average
0    A     2     4       11
1    B     3     5       15

3
投票
A = pd.DataFrame.from_dict({'Name':['A','A','B','B'],'Missed':[1,1,2,1],'Credit':[3,1,3,2],'Grades':[10,12,10,20]})

A.groupby('Name').agg({'Missed':'sum','Credit':'sum','Grades':'mean'})

0
投票

当我尝试使用 groupby 操作创建数据帧同一列的平均值和总和时,偶然发现了这个问题。 jezrael 答案的最后一部分也适用于相同的列。例如,使用上面相同的数据设置,您可以获得在

Grade
列上分区的
Name
列的平均值和总和:

grouped_df = df.groupby('Name').agg(avg_grade = ('Grade', 'mean'),
                                     total_grade = ('Grade', 'total'))
print(grouped_df)

         avg_grade  total_grade
Name                        
A          11.0           22
B          15.0           30

因此,我将这个答案留在这里,供那些遇到类似问题的人使用。

© www.soinside.com 2019 - 2024. All rights reserved.