在python pandas数据帧中使用多列进行总结

pas*_*nak 3 python pandas

在 R 中,我可以使用多个数据列汇总数据,如下所示:library(dplyr):

A =  B %>%
group_by(col1,col2) %>%
summarize(newcol = sum(col3)/sum(col4))
Run Code Online (Sandbox Code Playgroud)

但是在python的pandas的dataframes中,如何一步执行相同的操作呢?

我可以分两步完成。第1步:

A = B.groupby(['col1','col2']).agg({'col3': 'sum','col4':'sum'})
Run Code Online (Sandbox Code Playgroud)

第2步:

A['newcol'] = A['col3']/A['col4']
Run Code Online (Sandbox Code Playgroud)

ayh*_*han 5

您需要将assign与lambda表达式一起使用:

df = pd.DataFrame({'col1': list('aaabbb'), 
                   'col2': list('xyxyxy'), 
                   'col3': np.random.randn(6), 
                   'col4': np.random.randn(6)})

df
Out: 
  col1 col2      col3      col4
0    a    x -2.276155  0.323778
1    a    y -0.367525 -2.570142
2    a    x -0.672530  2.265560
3    b    y  0.588741  0.193499
4    b    x -1.368829  0.717997
5    b    y  1.012271  1.354408

(df.groupby(['col1','col2'])
   .agg({'col3': 'sum','col4':'sum'})
   .assign(newcol=lambda x: x['col3']/x['col4']))
Out: 
               col4      col3    newcol
col1 col2                              
a    x     2.589338 -2.948686 -1.138780
     y    -2.570142 -0.367525  0.142998
b    x     0.717997 -1.368829 -1.906453
     y     1.547907  1.601012  1.034308
Run Code Online (Sandbox Code Playgroud)

如果您只需要新列,请使用 apply:

df.groupby(['col1','col2']).apply(lambda x: x['col3'].sum() / x['col4'].sum())
Out: 
col1  col2
a     x      -1.138780
      y       0.142998
b     x      -1.906453
      y       1.034308
dtype: float64
Run Code Online (Sandbox Code Playgroud)

如果您在大数据集上使用它,请避免 apply 并使用 eval 代替。

(df.groupby(['col1','col2'])
   .agg({'col3': 'sum','col4':'sum'})
   .eval('col3 / col4'))
Run Code Online (Sandbox Code Playgroud)