Как применять различные агрегатные функции к разным столбцам в пандах? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть датафрейм с множеством столбцов, некоторые из них содержат цену, а остальные содержат объем, как показано ниже:

year_month   0_fx_price_gy 0_fx_volume_gy 1_fx_price_yuy 1_fx_volume_yuy
1990-01      2             10             3              30
1990-01      2             20             2              40
1990-02      2             30             3              50

Мне нужно сделать группировку по year_month и сделать среднее по столбцам цен и суммировать постолбцы тома.

есть ли какой-нибудь быстрый способ сделать это одним оператором, например, сделать среднее, если имя столбца содержит цену и сумму, если он содержит объем?

df.groupby ('year_month').?

Примечание: это просто пример данных с меньшим количеством столбцов, но формат аналогичен

output

year_month   0_fx_price_gy 0_fx_volume_gy 1_fx_price_yuy 1_fx_volume_yuy
1990-01      2             30             2.5              70
1990-02      2             30             3                50

1 Ответ

0 голосов
/ 26 сентября 2018

Создать словарь по сопоставленным значениям и передать DataFrameGroupBy.agg, последнее добавление reindex, если порядок выходных столбцов изменяется:

d1 = dict.fromkeys(df.columns[df.columns.str.contains('price')], 'mean')
d2 = dict.fromkeys(df.columns[df.columns.str.contains('volume')], 'sum')

#merge dicts together
d = {**d1, **d2}
print (d)
{'0_fx_price_gy': 'mean', '1_fx_price_yuy': 'mean',
 '0_fx_volume_gy': 'sum', '1_fx_volume_yuy': 'sum'}

Другойрешение для словаря:

d = {}
for c in df.columns:
    if 'price' in c:
        d[c] = 'mean'
    if 'volume' in c:
        d[c] = 'sum'

И решение должно быть упрощено, если только price и столбцы томов без первого столбца отфильтрованы по df.columns[1:]:

d = {x:'mean' if 'price' in x else 'sum' for x in df.columns[1:]}

df1 = df.groupby('year_month', as_index=False).agg(d).reindex(columns=df.columns)
print (df1)
  year_month  0_fx_price_gy  0_fx_volume_gy  1_fx_price_yuy  1_fx_volume_yuy
0    1990-01              2              40               3               60
1    1990-02              2              20               3               30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...