Python pandas:同时在不同列上的mean和sum groupby

aha*_*jib 10 python pandas

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

Name    Missed    Credit    Grade
A       1         3         10
A       1         1         12      
B       2         3         10
B       1         2         20
Run Code Online (Sandbox Code Playgroud)

我想要的输出是:

Name    Sum1   Sum2    Average
A       2      4      11
B       3      5      15   
Run Code Online (Sandbox Code Playgroud)

基本上得到列的总和Credit,并Missed要做到平均上Grade.我现在正在做的是两个groupby Name,然后得到sum和average,最后合并两个输出数据帧,这似乎不是最好的方法.我也在SO上找到了这个,如果我只想在一个列上工作那么有意义:

df.groupby('Name')['Credit'].agg(['sum','average'])
Run Code Online (Sandbox Code Playgroud)

但不确定如何为两列做单线程?

jez*_*ael 24

您需要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
Run Code Online (Sandbox Code Playgroud)

如果还想创建列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
Run Code Online (Sandbox Code Playgroud)

  • @Basile - 当然,使用 `Average=('Grade','mean')` 例如 `Average=('Grade','my _function')` 然后使用 `def my_function(x): return x.cumsum() .mean()` 或 `Average=('Grade',lambda x: x.cumsum().mean())` (2认同)