2017-05-08 3 views
3

データフレームを複数の列でグループ化し、集約して複数の統計を取得しています。行として列挙されたグループキーと各列として存在する各統計の組み合わせを使用して、完全にフラットな構造を得る方法はありますか?グループ化されたpandas.DataFrameをグループ化し、複数の集約をまとめました

import numpy as np 
import pandas as pd 

cities = ['Berlin', 'Oslo'] 
days = ['Monday', 'Friday'] 

data = pd.DataFrame({ 
     'city': np.random.choice(cities, 12), 
     'day': np.random.choice(days, 12), 
     'people': np.random.normal(loc=10, size=12), 
     'cats': np.random.normal(loc=6, size=12)}) 
grouped = data.groupby(['city', 'day']).agg([np.mean, np.std]) 

私は取得しています。この方法:

    cats    people   
        mean  std  mean  std 
city day            
Berlin Friday 6.146924 0.721263 10.445606 0.730992 
     Monday 5.239267  NaN 9.022811  NaN 
Oslo Friday 6.322276 0.866899 11.579813 0.114341 
     Monday 5.028919 0.815674 10.458439 1.182689 

私はそれがフラットを取得する必要があります:

city day  cats_mean cats_std people_mean people_std          
Berlin Friday 6.146924 0.721263 10.445606 0.730992 
Berlin Monday 5.239267  NaN 9.022811  NaN 
Oslo Friday 6.322276 0.866899 11.579813 0.114341 
Oslo Monday 5.028919 0.815674 10.458439 1.182689 
+0

' grouped.reset_indexを参照してください。インデックス – EdChum

+0

@EdChumそれでもMultiIndexが残っているので、集計された統計情報を列として扱うのが難しくなります。 –

+0

'grouped = grouped.reset_index()'を再度割り当てます。列を平坦化してもよろしいですか? – EdChum

答えて

5
In [36]: grouped.columns = grouped.columns.map('_'.join) 

In [37]: grouped = grouped.reset_index() 

In [38]: grouped 
Out[38]: 
    city  day cats_mean cats_std people_mean people_std 
0 Berlin Friday 5.852991 1.085163 11.078541 0.839688 
1 Berlin Monday 6.978343 0.630983  9.876106 1.846204 
2 Oslo Friday 6.096773 1.278176  9.710216 0.691672 
+0

これはよりクリーンです私の解決+1 – EdChum

+0

@エドム、ありがとう! – MaxU

+0

@ScottBoston、ありがとう、あなたのコメントをありがとう! – MaxU

2

あなたは、列レベルでリストの内包を行い、アンダースコアで参加することができますreset_index

In [39]:  
grouped.columns= ['_'.join(x) for x in list(zip(grouped.columns.get_level_values(0), grouped.columns.get_level_values(1)))] 
grouped = grouped.reset_index() 
grouped 

Out[39]: 
    city  day cats_mean cats_std people_mean people_std 
0 Berlin Friday 6.140710 0.555981 10.187634 0.359724 
1 Berlin Monday 6.420175 0.986568 10.134376 0.963938 
2 Oslo Friday 6.978572 0.573297 11.345484 1.454762 
3 Oslo Monday 4.594814  NaN 10.842988   NaN 
1

あなたの列は、列レベルとreset_indexを()ドロップ名前を変更する.aggに辞書を使用することができます。 復元するために、 `)(このSO Post

import numpy as np 
import pandas as pd 

cities = ['Berlin', 'Oslo'] 
days = ['Monday', 'Friday'] 

data = pd.DataFrame({ 
     'city': np.random.choice(cities, 12), 
     'day': np.random.choice(days, 12), 
     'people': np.random.normal(loc=10, size=12), 
     'cats': np.random.normal(loc=6, size=12)}) 
grouped = data.groupby(['city', 'day']).agg({'cats':{'cats_mean':np.mean,'cats_std':np.std},'people':{'people_mean':np.mean,'people_std':np.std}}) 

grouped.columns = grouped.columns.droplevel() 
grouped.reset_index() 

    city  day people_mean people_std cats_std cats_mean 
0 Berlin Friday  9.645190 0.699684 0.973866 6.478510 
1 Berlin Monday  9.556898 0.126810 0.336654 6.624288 
2 Oslo Friday 11.593491   NaN  NaN 6.206595 
3 Oslo Monday 10.202183 1.058651 0.657939 6.019748 
あなただけ呼び出すことができます
+1

'FutureWarning:名前の変更は廃止され、将来のバージョンでは削除されます。ここには[リンク](http://pandas.pydata.org/pandas-docs/version/0.20/whatsnew.html#deprecate-groupby-agg-with-a-dictionary-when-renaming) – MaxU

関連する問題