2016-07-25 6 views
4

私はパンダの初心者です。私は、スポンサーや企業が撮影した検査のデータフレームを持っている:pandas:2つの異なるディメンションでピボットテーブルを作成しますか?

import pandas pd 

df = pd.DataFrame({ 
    'sponsor': ['A71991', 'A71991', 'A71991', 'A81001', 'A81001'], 
    'sponsor_class': ['Industry', 'Industry', 'Industry', 'NIH', 'NIH'], 
    'year': [2012, 2013, 2013, 2012, 2013], 
    'passed': [True, False, True, True, True], 
}) 

今私は年によって出力するCSVは、各スポンサーとそのクラスの行を持つファイル、およびパスと合計レートの列たい:

sponsor,sponsor_class,2012_total,2012_passed,2013_total,2013_passed 
A71991,Industry,1,1,2,1 
A81001,NIH,1,1,1,1 

dfからこの再構成されたデータフレームにはどうすれば到達できますか?私はsponsorsponsor_classでグループ化してから、総数とpassedTrueとなる回数をピボットアウトしてから、それらの列を平坦化する必要があると思います。 (。私はpd.write_csv(mydf)で終わる知っている)

私はこれで始まる試してみた:

df_g = df.groupby(['sponsor', 'sponsor_class', 'year', 'passed']) 

しかし、それは私の空のデータフレームを提供します。

私はピボットテーブルをどこかにピックアップしてステータスを渡す必要があると思いますが、どこから始めたらいいかわかりません。

UPDATE:どこか行き方:

df_g = df_completed.pivot_table(index=['lead_sponsor', 'lead_sponsor_class'], 
           columns='year', 
           aggfunc=len, fill_value=0) 
df_g[['passed']] 

は、今、私が出て作業する必要がある(1)どのようにすべての行の数だけでなく、ちょうどpassedを得るために、および(2)未方法列をCSVファイルにネストします。

答えて

2
# set index to prep for unstack 
df1 = df.set_index(['sponsor', 'sponsor_class', 'year']).astype(int) 

# groupby all the stuff in the index 
gb = df1.groupby(level=[0, 1, 2]).passed 

# use agg to get sum and count  
# swaplevel and sort_index to get stuff sorted out 
df2 = gb.agg({'passed': 'sum', 'total': 'count'}) \ 
      .unstack().swaplevel(0, 1, 1).sort_index(1) 

# collapse multiindex into index 
df2.columns = df2.columns.to_series().apply(lambda x: '{}_{}'.format(*x)) 

print df2.reset_index().to_csv(index=None) 


sponsor,sponsor_class,2012_passed,2012_total,2013_passed,2013_total 
A71991,Industry,1,1,1,2 
A81001,NIH,1,1,1,1 
+0

これは素晴らしいです、ありがとう! – Richard

2

私はかなりの数のステップでそれを行う方法を見ることができます。

import numpy as np, pandas as pd 
df['total'] = df['passed'].astype(int) 
ldf = pd.pivot_table(df,index=['sponsor','sponsor_class'],columns='year', 
        values=['total'],aggfunc=len) # total counts 
rdf = pd.pivot_table(df,index=['sponsor','sponsor_class'],columns='year', 
        values=['total'],aggfunc=np.sum) # number passed 
cdf = pd.concat([ldf,rdf],axis=1) # combine horizontally 
cdf.columns = cdf.columns.get_level_values(0) # flatten index 
cdf.reset_index(inplace=True) 
columns = ['sponsor','sponsor_class'] 
yrs = sorted(df['year'].unique()) 
columns.extend(['{}_total'.format(yr) for yr in yrs]) 
columns.extend(['{}_passed'.format(yr) for yr in yrs]) 
cdf.columns = columns 

の検索結果を最後に

>>> cdf 
    sponsor sponsor_class 2012_total 2013_total 2012_passed 2013_passed 
0 A71991  Industry   1   2   1   1 
1 A81001   NIH   1   1   1   1 

cdf.to_csv('/path/to/file.csv',index=False) 
関連する問題