Для первого сценария достаточно pandas concat
:
dat = df.groupby("cyl")
pd.concat([dat[["mpg", "disp"]].sum(), dat[["drat", "wt", "qsec"]].mean()], axis=1)
Для части обработки регулярных выражений / строк многословность неизбежна:
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)
Было бы круто, если бы вы могли бы написать функцию, которая могла бы инкапсулировать across
, особенно для regex
- это прекрасный прекрасный трюк.
Примечание: передача словаря не длиннее и не более подробна, чем первый пример, который вы процитировали. Я бы посоветовал по методу pandas concat
:
dat.agg({"mpg": "sum",
"disp": "sum",
"drat": "mean",
"wt": "mean",
"qsec": "mean"})
Не убирает блеск с across
-> выглядит круто.
Обновить : Для части регулярного выражения / строки, взяв реплику из сообщения @ Richiev , понимание словаря здесь очень хорошо вписывается:
df.groupby('cyl').agg({col :'mean'
if col.endswith('t')
else 'sum'
for col in df.filter(regex=r".*(p|t)$").columns
})