2016-07-01 8 views
2

私はこのようになりますデータフレームがあります、コンサルタントに費やされた合計、および他のすべてに費やした総:pandas:カスタムカテゴリ別にグループ化し、ピボットしますか?

   Company Name       Category Amount 
0    Teva Limited Consultancy      650.000 
1    Teva Limited Consultancy      5.300 
2  Eli & Company Ltd Events       15.000 
3      Meda Events       60.000 
4    Teva Limited Events       400.000 
4    Teva Limited Travel       202.000 
4      Meda Travel       399.860 

私は新会社ごとの行とデータフレーム、および2つの列を作成したいがイベント+旅行を意味します。

Company Name  Spend Consultancy  Spend Other 
Teva UK Limited  653.000    602.000 
Meda Pharma   0.000     459.860 

これを行うための最善の方法は何ですか:

だから、次のようになりますか?

私は名前やカテゴリ別にグループ化し、スタートです量、合計している:

df.groupby(('Company Name', 'Category')).sum() 

をしかし、今、私はオーダーメイドの方法で一緒にカテゴリを組み合わせ、またはどのようにするかどうかはわかりませんそれらを列にピボットする。私はピボットテーブルが必要かもしれないと思いますか?

ありがとうございました!

答えて

0

これはそれを行う必要があります。

cdf = df.groupby([df['Company Name'], df.Category == 'Consultancy']).Amount.sum().unstack().fillna(0) 
cdf.set_axis(1, ['Other', 'Consultancy']) 
print cdf 

        Other Consultancy 
Company Name       
Eli & Company Ltd 15.00   0.0 
Meda    459.86   0.0 
Teva Limited  602.00  655.3 
1

だけ['Consultancy', 'Other']カテゴリを含む新しいcat列を作成するためのassign()を使用して、pivot_table()機能でこの新しい列を使用することができます。

In [10]: (df.assign(cat=np.where(df.Category=='Consultancy', df.Category, 'Other')) 
    ....: .pivot_table(index='Company Name', columns='cat', values='Amount', 
    ....:     aggfunc='sum', fill_value=0) 
    ....:) 
Out[10]: 
cat    Consultancy Other 
Company Name 
Eli & Company Ltd   0.0 15.00 
Meda      0.0 459.86 
Teva Limited    655.3 602.00 

または持つCompany Name通常の列として:

In [17]: %paste 
(df.assign(cat=np.where(df.Category=='Consultancy', df.Category, 'Other')) 
    .pivot_table(index='Company Name', columns='cat', values='Amount', 
       aggfunc='sum', fill_value=0) 
    .reset_index() 
) 
## -- End pasted text -- 
Out[17]: 
cat  Company Name Consultancy Other 
0 Eli & Company Ltd   0.0 15.00 
1     Meda   0.0 459.86 
2   Teva Limited  655.3 602.00 

説明:

In [11]: df.assign(cat=np.where(df.Category=='Consultancy', df.Category, 'Other')) 
Out[11]: 
     Company Name  Category Amount   cat 
0  Teva Limited Consultancy 650.00 Consultancy 
1  Teva Limited Consultancy 5.30 Consultancy 
2 Eli & Company Ltd  Events 15.00  Other 
3    Meda  Events 60.00  Other 
4  Teva Limited  Events 400.00  Other 
5  Teva Limited  Travel 202.00  Other 
6    Meda  Travel 399.86  Other 
関連する問題