2017-06-19 20 views
18

私はパンダのデータフレームでいくつかの集計をしようとしています。パンダの集計に関する警告(FutureWarning:名前を変更してdictを使用することは推奨されていません)

FutureWarning:リネームして辞書を使用しては廃止され、 は、将来のバージョンの戻りのスーパーでは削除されます(DataFrameGroupBy、 自己次の警告を生成します

import pandas as pd 

df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], 
        "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0]}) 

df.groupby(["User"]).agg({"Amount": {"Sum": "sum", "Count": "count"}}) 

Out[1]: 
     Amount  
     Sum Count 
User    
user1 18.0  2 
user2 20.5  3 
user3 10.5  1 

:ここではサンプルコードはあります).aggregate(arg、* args、** kwargs)

どうすればこの問題を回避できますか?

+1

私はこれが減価償却されている理由を知ってみたい(私は正当な理由があると確信しています)。誰かがそれに関する議論へのリンクを持っていますか? –

答えて

23

使用GROUPBY apply

  • が列
  • の名前を変更し集計を実行するためにGROUPBY applyメソッドを使用して、列に

の名前を変更するためにシリーズを返すことができます

  • 名にスペースを可能にします選択した任意の方法で返された列を並べ替えることができます
  • 列間の対話を許可します
  • これを行うには、単一のレベルの指標とNOTマルチインデックス
  • 返します:

    • あなたはこのカスタム関数は、データフレームとして各グループを渡されapply
    • に渡すカスタム関数を作成します
    • シリーズを返す
    • このシリーズのインデックスは新しいカラムになります

    偽のデータを作成します

    df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1", "user3"], 
            "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0, 9], 
            'Score': [9, 1, 8, 7, 7, 6, 9]}) 
    

    enter image description here

    シリーズ
    my_aggの内部変数xは、データフレーム

    def my_agg(x): 
        names = { 
         'Amount mean': x['Amount'].mean(), 
         'Amount std': x['Amount'].std(), 
         'Amount range': x['Amount'].max() - x['Amount'].min(), 
         'Score Max': x['Score'].max(), 
         'Score Sum': x['Score'].sum(), 
         'Amount Score Sum': (x['Amount'] * x['Score']).sum()} 
    
        return pd.Series(names, index=['Amount range', 'Amount std', 'Amount mean', 
                'Score Sum', 'Score Max', 'Amount Score Sum']) 
    
    あるを返すカスタム関数を作成します

    applyメソッドGroupByにこのカスタム関数を渡し

    df.groupby('User').apply(my_agg) 
    

    enter image description here

    大きな欠点は、この機能はGROUPBYと辞書を使用してcythonized aggregations

    ためaggよりもはるかに遅くなるということですaggメソッド

    ディクショナリ辞書を使用するriesはその複雑さとやや曖昧な性質のため削除されました。この機能を将来どのように改善するかについては、ongoing discussionがあります。ここでは、groupbyコールの後に集約カラムに直接アクセスできます。適用したいすべての集約関数のリストを渡すだけです。

    df.groupby('User')['Amount'].agg(['sum', 'count']) 
    

    出力

     sum count 
    User    
    user1 18.0  2 
    user2 20.5  3 
    user3 10.5  1 
    

    Otherという名前の別の数値列があった場合は、ここのように、明示的に異なる列に異なる集計を示すために辞書を使用することも可能です。

    df = pd.DataFrame({"User": ["user1", "user2", "user2", "user3", "user2", "user1"], 
           "Amount": [10.0, 5.0, 8.0, 10.5, 7.5, 8.0], 
           'Other': [1,2,3,4,5,6]}) 
    
    df.groupby('User').agg({'Amount' : ['sum', 'count'], 'Other':['max', 'std']}) 
    

    出力

     Amount  Other   
         sum count max  std 
    User        
    user1 18.0  2  6 3.535534 
    user2 20.5  3  5 1.527525 
    user3 10.5  1  4  NaN 
    
    +7

    ただし、名前変更のアスペクトも、集計後のデフォルトとは異なる列名にすることをお勧めします。この機能を引き続き使用する構文はありますか? – ErnestScribbler

    +1

    同じcolを2回(1分1回)使用しているので、結果をオブジェクトに戻すときに一意に参照する方法が必要なので、命名について同じ質問がありました。 – mgmonteleone

    +0

    列の名前を変更する場合は、手動で行う必要があります。リストを使って 'df.columns = ['your'、 'new'、 'col'、 'names']'のいずれかを置き換えるか、この結果があるので少し難しい 'rename'メソッドを使用してくださいマルチインデックスで –

    関連する問題