python/pandas 相当于 dplyr 1.0.0 summarise(across())

Kyo*_*uma 3 python r pandas dplyr

在 R 中,我发现以下内容在处理许多变量时非常有用:

library(dplyr)
dat <- group_by(mtcars, cyl) 
summarize(dat, across(c('mpg','disp'), sum), across(c('drat','wt','qsec'), mean))
# A tibble: 3 x 5
    cyl  disp    hp  drat    wt
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     4 1156.   909  4.07  2.29
2     6 1283.   856  3.59  3.12
3     8 4943.  2929  3.23  4.00
Run Code Online (Sandbox Code Playgroud)

或者更好的是,使用伪正则表达式进行选择

summarize(dat, across(ends_with('p'), sum), across(ends_with('t'), mean))
Run Code Online (Sandbox Code Playgroud)

在 pandas 中,等效的似乎是将变量一一传递到字典中,例如来自这个要点

group_agg = df.groupby("group1").agg({
  "var1" : ["mean"], 
  "var2" : ["sum"], 
  "var3" : ["mean"]
  })
Run Code Online (Sandbox Code Playgroud)

在 pandas 或其他包中是否有更简洁的方法来执行此操作?

sam*_*mmy 5

对于第一种情况,pandas concat就足够了:

dat = df.groupby("cyl")

pd.concat([dat[["mpg", "disp"]].sum(), 
           dat[["drat", "wt", "qsec"]].mean()], 
          axis=1)
Run Code Online (Sandbox Code Playgroud)

对于正则表达式/字符串处理部分,冗长是不可避免的:

dat = df.groupby("cyl")

pd.concat([dat[["mpg", "disp"]].sum(), 
           dat[["drat", "wt", "qsec"]].mean()], 
          axis=1)
Run Code Online (Sandbox Code Playgroud)

另一种选择(IMO 更简单)是在聚合之前构建字典 - 受 @RichieV 启发:

cols_p = [col for col in df.columns if col.endswith("p")]
cols_t = [col for col in df.columns if col.endswith("t")]
pd.concat((dat[cols_p].sum(), dat[cols_t].mean()), axis=1)
       disp    hp      drat        wt
cyl
4    1156.5   909  4.070909  2.285727
6    1283.2   856  3.585714  3.117143
8    4943.4  2929  3.229286  3.999214
Run Code Online (Sandbox Code Playgroud)