2017-06-22 5 views
0

私は任意の算術関数(通常sum、avg、divis &の減算)を摂取できるアプリケーションを作成するために.agg関数を使用しようとしています。 2番目の算術関数を実行するが、私はそれを行う正しい方法を理解することはできません。Python/Pandas .agg関数

試み1(2つのステップに2件の集計を分離):

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です。したがって、出力値は重複しています。元にjoinが必要な場合

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 

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 
関連する問題