2017-06-22 76 views
0

我試圖使用.agg函數創建一個應用程序,可以進任何算術函數(通常SUM,AVG,divis &減法),與任何列,然後可以使用這些結果來執行第二個算術函數,但我無法找出正確的方法來做到這一點。的Python /大熊貓.agg功能

嘗試1(兩個聚合分離成兩個步驟):

aggregation = { 
     'Att': {'metric_numerator': 'sum'}, 
     'Enr': {'metric_denominator': 'sum'}, 
     } 

    df_aggregated = data_filtered.groupby(groupby_columns).agg(aggregation) 

    aggregation2 = { 
     'calculated_rate': lambda x: (x['metric_numerator'] - x['metric_denominator']) * 100 
     } 

     groupby_list.append('metric_numerator') 
     groupby_list.append('metric_denominator') 

     input_df = input_df.groupby(groupby_list).agg(aggregation2) 

注意:第一個聚合的工作原理,但第二步不

嘗試#2(包括在一個所有聚合字典(首選)):

aggregation = { 
     'Att': {'metric_numerator': 'sum'}, 
     'Enr': {'metric_denominator': 'sum', 
         'AGG': lambda x: (x['metric_numerator'] - x['metric_denominator']) * 100} 
     } 

    df_aggregated = data_filtered.groupby(groupby_columns,).agg(aggregation) 

注:此失敗,因爲我對「AGG」計算錯誤的語法,但我不知道它應該是什麼

謝謝您的幫助。如果您認爲.agg函數不是我應該使用的,我也會接受建議。

回答

0

您需要flexible apply使用自定義功能。

也有是有點問題的ab返回標量,c回報array。所以在輸出值是重複的。

groupby_columns = 'a' 
data = {'a' : list('AAABBB'), 
     'metric_numerator':[100,500,310,110,210,150], 
     'metric_denominator':[200,700,300,100,110,130]} 
data_filtered = pd.DataFrame(data) 
print (data_filtered) 
    a metric_denominator metric_numerator 
0 A     200    100 
1 A     700    500 
2 A     300    310 
3 B     100    110 
4 B     110    210 
5 B     130    150 

def aggregation(x): 
    a = x['metric_numerator'].sum() 
    b = x['metric_denominator'].sum() 
    c = (x['metric_numerator'] - x['metric_denominator']) * 100 
    return pd.DataFrame({'Att':a, 'Enr':b, 'AGG':c}) 

df_aggregated = data_filtered.groupby(groupby_columns).apply(aggregation) 
print (df_aggregated) 
    AGG Att Enr 
0 -10000 910 1200 
1 -20000 910 1200 
2 1000 910 1200 
3 1000 470 340 
4 10000 470 340 
5 2000 470 340 

如果需要join原始:

df1 = data_filtered.join(df_aggregated) 
print (df1) 
    a metric_denominator metric_numerator AGG Att Enr 
0 A     200    100 -10000 910 1200 
1 A     700    500 -20000 910 1200 
2 A     300    310 1000 910 1200 
3 B     100    110 1000 470 340 
4 B     110    210 10000 470 340 
5 B     130    150 2000 470 340