2017-12-31 330 views
1

に複数の機能を集約を実行する私は、次のデータフレームがあります、しかしGROUPBYとパンダ

df2 = df.groupby(pd.TimeGrouper(freq='M')) 
df2 = df.agg({'total_in': 'sum', 'total_out': 'sum', 'balance': 'last'}) 

date   in out balance 

01/01/2017 50 70 100 
02/01/2017 100 10 190 
...   ... ... ... 

を私は次のコードで(月ごとにグループ化された)要約ファイルを作成していますまた、「最大」と「最大」の列を作成したいと考えています。

私は、次の

df2 = df2.agg({'total_in': 'sum', 'total_out': 'sum', 'largest in': 'max', 'largest out': 'max', 'balance': 'last'}) 

を試してみましたが、これは新しい列のキーのエラーがスローされます。 私はAggステートメントで新しい列を作成できることを期待していましたが、これは当てはまりません。

通常のデータベースにこの列を追加することはできませんが、これらの値は1日あたりの意味が比較的無駄になります。処理能力の無駄遣い/もっと多くのことができるはずです効率的に

これを行うより良い方法はありますか?

+0

いいえ、これは動作しません。キーは、操作する列です。値は関数または関数のリストです。 –

+0

複数の集計を適用するには '{'total_in':['sum'、 'max'] ...}'を実行することができますが、 'total_in'のレベルの列になります... –

答えて

2

ここで注意すべき点がいくつ -

  1. aggdictをとります。この場合、キーは集約を実行する列であり、値は関数または関数のリストです。
  2. pd.TimeGrouper(現在はv0.21のように)は推奨されていません。代わりにpd.Grouperを使用してください。の名前である第一の要素(たとえば、total_in) -

    f = { 
         'in'  : [('total_in', sum), ('largest_in', max)], 
         'out'  : [('total_out', sum), ('largest_out', max)], 
         'balance' : 'last' 
    } 
    df = df.groupby(pd.Grouper(key='date', freq='1M')).agg(f) 
    

    各タプルは、2つの要素で構成され -

このはdateは、インデックスの一部ではないと仮定すると、私がやってお勧めしたいものです2番目の要素(例:sum)はキーに適用する関数です。出力はMultiIndex列のデータフレームになります。

dateが既にインデックスの一部である場合は、key='date'ビットをドロップすることができます。

+1

私はコードを使用して私が望むCSVを作成してください。多くのありがとう(そして幸せな新年!) – Jasper