2016-03-22 3 views
0

Рассмотрим следующий примерВ 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()}) 

, но тот выходит из строя. Что я здесь делаю неправильно?

Благодаря

ответ

1

если они выражены в двух строках, логика становится чище писать & чтения

df['d_pos_sum'] = df.groupby(['A', 'B']).transform(lambda x: x[x>0].sum()) 
df['d_neg_sum'] = df.groupby(['A', 'B']).transform(lambda x: x[x<0].sum()) 
+0

спасибо! но почему я могу написать 'agg_df = group.agg ({'D': ['mean', 'max']})', но не 'agg_df = group.agg ({'D': [lambda x: x.sum(), лямбда x: x.max()]}) '? Другими словами, я вынужден написать две строки в этом случае? –

+1

вы можете передать несколько функций, просто не 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 строки. –

+0

хороший. Спасибо! –