Рассмотрим следующий примерВ Pandas, как отправить результат преобразования groupby в исходный dataframe?
import pandas as pd
import numpy as np
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'D' : np.random.randn(8)})
group=df.groupby(['A','B'])
agg_df=group.agg({'D':lambda x: x[x>0].sum(), 'D':lambda x: x[x<0].sum()})
Здесь я хотел бы получить две дополнительные переменные в исходной dataframe ДФ.
Один из них представляет собой сумму положительных элементов в D, а также сумму, которая представляет собой сумму отрицательных элементов в D. Использование agg
является несгибаемым, как вы можете видеть в коде выше.
Однако я бы хотел, чтобы эти значения повторялись в основной информационной кадре для каждой строки, соответствующей конкретной комбинации groupby
.
Наивный синтаксис будет использовать:
transform_df=group.transform({'D':lambda x: x[x>0].sum(), 'D':lambda x: x[x<0].sum()})
, но тот выходит из строя. Что я здесь делаю неправильно?
Благодаря
спасибо! но почему я могу написать 'agg_df = group.agg ({'D': ['mean', 'max']})', но не 'agg_df = group.agg ({'D': [lambda x: x.sum(), лямбда x: x.max()]}) '? Другими словами, я вынужден написать две строки в этом случае? –
вы можете передать несколько функций, просто не lambdas, определите функции в предыдущих строках, то есть 'def d_sum (x): return x.sum()' и 'def d_max (x): return x.max()', затем агрегировать в одной строке: 'agg_df = group.agg ({'D': [d_sum, d_max]})', но это решение на самом деле 3 строки. –
хороший. Спасибо! –