1) Чтобы определить, является ли столбец числовым, вы можете использовать pandas.api.types.is_numeric_dtype
2) Чтобы найти оставшиеся столбцы, вы можете использовать set(df.columns)
минус столбцы, которые вы использовалив groupby
и в тех, у которых есть определенные функции agg, например,
from pandas.api.types import is_numeric_dtype
fields_groupby = ['Day', 'Month']
fields_specific = {
'High': [min, 'mean', max],
'Low': [min, 'mean', max],
'Open': 'mean',
'Size': lambda x: x.value_counts().index[0],
}
fields_other = set(set(stock.columns) - set(fields_groupby) - set(fields_specific))
fields_agg_remaining = {col: 'mean' if is_numeric_dtype(stock[col]) else lambda x: x.value_counts().index[1] for col in fields_other}
после этого, объедините набор fields_specific
и fields_agg_remaining
в список полей agg
agg_fields = fields_agg_remaining
agg_fields.update(fields_specific)
stock.groupby(['Day', 'Month']).agg(agg_fields).round(2)
РЕДАКТИРОВАТЬ: Вы можете объединить все, чтобы поместить их в аргумент словаря, например:
stock.groupby(['Day', 'Month']).agg(
{col:
[min, 'mean', max] if col in ['High', 'Low'] else
'mean' if col in ['Open'] else
lambda x: x.value_counts().index[0] if col in ['Size'] else
'mean' if is_numeric_dtype(stock[col]) else
lambda x: x.value_counts().index[1] for col in set(set(stock.columns) - {'Day', 'Month'})}
).round(2)