2016-10-09 17 views
0

私はこのようになりますパンダのデータフレームを持っている:パンダに階層列を作成する方法は?

  rank_2015 num_2015 rank_2014 num_2014 .... num_2008 
France 8   1200  9   1216  .... 1171 
Italy  11   789  6   788  .... 654 

今私は年によって、ちょうどnum_列和の棒グラフを描きたいです。ですから、x軸については、2008年から2015年にかけて、y軸には、num_列の合計が必要です。

これを行うにはどうすればよいですか?

df.sum() 

しかし、私にはわからないことだけ num_列をグラフ化する方法であり、また、どのように再ラベル付け、それらの列がラベルではなく整数であるように:私は、各列の合計を取得する方法を知っています文字列よりも正しく表示されるようにします。
  rank    num 
      2015  2014 2015  2014 .... 2008 
France 8   9  1200  1216 .... 1171 
Italy  11   6  789  788 .... 654 

は、その後、私はちょうど numセクション内の列をグラフ化できます。私はこのように、階層的な列を作成したい場合は

私は思ったんだけど。

データフレームをこの形にするにはどうすればよいですか?

答えて

1

あなたがデータフレームに列 を変換するために、正規表現パターン(.+)_(\d+)str.extractを使用することができます。

cols = df.columns.str.extract(r'(.+)_(\d+)', expand=True) 
#  0  1 
# 0 num 2008 
# 1 num 2014 
# 2 num 2015 
# 3 rank 2014 
# 4 rank 2015 

あなたはその後、colsからbuild a hierarchical (MultiIndex) indexは、それを再割り当てすることができ df.columnsへ:そう

df.columns = pd.MultiIndex.from_arrays((cols[0], cols[1])) 

そのdf

になります
  num    rank  
     2008 2014 2015 2014 2015 
France 1171 1216 1200 9 8 
Italy 654 788 789 6 11 

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({ 'num_2008': [1171, 654], 
'num_2014': [1216, 788], 
'num_2015': [1200, 789], 
'rank_2014': [9, 6], 
'rank_2015': [8, 11]}, index=['France', 'Italy']) 


cols = df.columns.str.extract(r'(.+)_(\d+)', expand=True) 
cols[1] = pd.to_numeric(cols[1]) 
df.columns = pd.MultiIndex.from_arrays((cols[0], cols[1])) 
df.columns.names = [None]*2 

df['num'].sum().plot(kind='bar') 
plt.show() 

enter image description here

1

おそらく、あなたが再整形するデータセットを必要としない、それが簡単に実現することができます。

  1. のみ
  2. は、列の名前を変更しnum_データを含む新しいデータセットを作成します
  3. プロット和

ダミーデータ:

enter image description here

コード:

df_num = df[[c for c in df.columns if c.startswith('num_')]] 
df_num.columns = [c.lstrip('num_') for c in df_num.columns] 
df_num.sum().plot(kind='bar') 

結果:

enter image description here

関連する問題