2017-07-20 12 views
1

私は(編集さ機密情報)を生成するために2つの列('Call', 'month')でグループ化されたデータフレームを持っている:パイソンパンダ - 異なる方向にグループ二つの列

enter image description here

フェッチした後で、私は(使用コード私たちのSQLデータベースからrelevent行)です:私がやりたいこと「コール」の行で、数ヶ月はカウント」のそれぞれについて、1ヶ月で上部に行くように、それを持っている

a01=[] 

for row in rows: 
    a01.append({'GrantRefNumber':row[0],'Call': row [1],'FirstReceivedDate':row[2],'TotalGrantValue':row[3]}) 

df = pd.DataFrame(a01) 
new_df01 = df[['Call','FirstReceivedDate','TotalGrantValue']] 
new_df01['month'] = pd.Categorical(new_df01['FirstReceivedDate'].dt.strftime('%b'), 
           categories=vals, ordered=True) 


groupA01 = new_df01.groupby(['month','Call']).agg({'TotalGrantValue':sum, 'FirstReceivedDate':'count'}).rename(columns={'FirstReceivedDate':'Count'}) 
groupA01['TotalGrantValue'] = groupA01['TotalGrantValue'].map('{:,.2f}'.format) 
groupA01 

'および' TotalGrantValue '同様に:

enter image description here

誰でも助けることができますか?

答えて

3

あなたはsort_indexで列のMultiIndexswaplevelと最後の並べ替え、その後、リシェイプのためにそれらをunstackが必要になります。

df = gA.unstack(0).swaplevel(0,1,1).sort_index(1) 

はサンプル:

#sample data 
rng = pd.date_range('2017-04-03', periods=20, freq='20d') 
aDF = pd.DataFrame({'FirstReceivedDate': rng, 'TotalGrantValue': range(20), 
        'Call':list('aaaaabbbbbcccccddddd')}) 
#print (aDF) 

rgbDF = aDF[['FirstReceivedDate','TotalGrantValue', 'Call']].copy() 

vals = ['Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar'] 
rgbDF['month'] = pd.Categorical(rgbDF['FirstReceivedDate'].dt.strftime('%b'), 
           categories=vals, ordered=True) 

gA = rgbDF.groupby(['month','Call']) \ 
      .agg({'TotalGrantValue':'sum', 'FirstReceivedDate':'count'}) \ 
      .rename(columns={'FirstReceivedDate':'Count'}) 
gA['TotalGrantValue'] = gA['TotalGrantValue'].map('{:,.2f}'.format) 

print (gA) 
      TotalGrantValue Count 
month Call      
Apr a    1.00  2 
     d    19.00  1 
May a    2.00  1 
Jun a    7.00  2 
Jul b    5.00  1 
Aug b    13.00  2 
Sep b    17.00  2 
Oct c    10.00  1 
Nov c    23.00  2 
Dec c    13.00  1 
Jan c    14.00  1 
     d    15.00  1 
Feb d    16.00  1 
Mar d    35.00  2 

df = gA.unstack(0).swaplevel(0,1,1).sort_index(1) 
print (df) 
month Apr     May     Jun     Jul \ 
     Count TotalGrantValue Count TotalGrantValue Count TotalGrantValue Count 
Call                    
a  2.0   1.00 1.0   2.00 2.0   7.00 NaN 
b  NaN   None NaN   None NaN   None 1.0 
c  NaN   None NaN   None NaN   None NaN 
d  1.0   19.00 NaN   None NaN   None NaN 

month     Aug      ...   Nov \ 
     TotalGrantValue Count TotalGrantValue  ...  Count 
Call            ...    
a    None NaN   None  ...   NaN 
b    5.00 2.0   13.00  ...   NaN 
c    None NaN   None  ...   2.0 
d    None NaN   None  ...   NaN 

month     Dec     Jan     Feb \ 
     TotalGrantValue Count TotalGrantValue Count TotalGrantValue Count 
Call                  
a    None NaN   None NaN   None NaN 
b    None NaN   None NaN   None NaN 
c    23.00 1.0   13.00 1.0   14.00 NaN 
d    None NaN   None 1.0   15.00 1.0 

month     Mar     
     TotalGrantValue Count TotalGrantValue 
Call           
a    None NaN   None 
b    None NaN   None 
c    None NaN   None 
d    16.00 2.0   35.00 

[4 rows x 24 columns] 
+0

Jezraelを使用してnew_df01から直接試すことができます。あなたは素晴らしいです! )... ...完璧に動作します! – ScoutEU

+0

喜んで助けることができます!ほんの少しの小さなもの、問題のリストのvalsを忘れてしまったので、私は最後の答えからそれを使いました;) – jezrael

+0

Ha、細部には良いアイ。ありがとう:) – ScoutEU

1

あなたはpd.pivot_table()機能

data_p = pd.pivot_table(new_df01, values=['TotalGrantValue'], index=['Call'], columns=['month'], aggfunc=('count', 'mean')) 
+0

ありがとう、私はそれをチェックします! – ScoutEU

関連する問題