2017-11-02 12 views
2

ライブラリはマルチインデックスを使ってパンダのデータフレームを手渡します。 結果は次のようになります。パンダのマルチインデックスを扱うための戦略

xf.index 
DatetimeIndex(['2011-03-31', '2011-04-01', '2011-04-04', '2011-04-05', 
       '2011-04-06', '2011-04-07', '2011-04-08', '2011-04-11', 
       '2011-04-12', '2011-04-13', 
       ... 
       '2017-10-19', '2017-10-20', '2017-10-23', '2017-10-24', 
       '2017-10-25', '2017-10-26', '2017-10-27', '2017-10-30', 
       '2017-10-31', '2017-11-01'], 
       dtype='datetime64[ns]', name=u'date', length=1702, freq=None) 

xf.columns 

MultiIndex(levels=[[u'jan', u'feb', u'mar'], [u'PRICE', u'AMOUNT', u'NAME', u'STYLE']], 
      labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]]) 

基本的な考え方は数ヶ月1月、2月のためということで、傷毎日評価されているいくつかの情報フィールド(価格、量、名前、スタイル)があります。

私は本当にこのマルチインデックスを操作していません。

私が行うために必要なものの一種:

  • は、既存の第二レベルの列を変更します。例えば。すべての '名前'を小文字にします。

  • "modified_name"などの新しい列を追加します。これは、
    で、jan、feb、およびmarchのすべてに適用されます。

私は単に「1月」のいずれかの値を持つ1列、「月」は存在するように(単一レベルに全体の列のインデックスを平らにしようとする必要がある場合、私は「、2月を知りません」、 『傷』、その後、他の既存のレベル2の列(価格、量、名前、スタイル)。私はマルチインデックスを必要としません。

どのように私はそれにデータフレームを折りたたむでしょうか?

か階層的なインデックスの下で列を変更したり追加したりする方法はありますか?

答えて

0

シンプルなのはクラス作成ですリシェイプすることにより、ICの列 - stackによってインデックスとしてMultiIndexを取得:

df = df.stack(0) 

をそして列を変更:

df.columns = df.columns.str.lower() 
df['new_col'] = 1 

と最後のリシェイプバックunstackによります。

サンプル:

i = pd.DatetimeIndex(['2011-03-31', '2011-04-01', '2011-04-04', '2011-04-05', 
       '2011-04-06', '2011-04-07', '2011-04-08', '2011-04-11', 
       '2011-04-12', '2011-04-13']) 
cols = pd.MultiIndex.from_product([[u'jan', u'feb'],[u'PRICE', u'AMOUNT', u'NAME']]) 
df = pd.DataFrame(np.random.randint(10, size=(len(i), 6)),index=i, columns=cols) 

print (df) 
      jan    feb    
      PRICE AMOUNT NAME PRICE AMOUNT NAME 
2011-03-31  2  7 3  6  0 5 
2011-04-01  6  2 5  0  4 2 
2011-04-04  9  0 7  2  7 9 
2011-04-05  5  3 5  7  9 9 
2011-04-06  1  4 4  1  6 3 
2011-04-07  1  7 4  9  6 7 
2011-04-08  6  1 7  4  4 2 
2011-04-11  7  5 6  8  0 3 
2011-04-12  3  3 9  2  4 0 
2011-04-13  0  0 1  9  0 3 

df = df.stack(0) 
print (df) 
       AMOUNT NAME PRICE 
2011-03-31 feb  0  5  6 
      jan  7  3  2 
2011-04-01 feb  4  2  0 
      jan  2  5  6 
2011-04-04 feb  7  9  2 
      jan  0  7  9 
2011-04-05 feb  9  9  7 
      jan  3  5  5 
2011-04-06 feb  6  3  1 
      jan  4  4  1 
2011-04-07 feb  6  7  9 
      jan  7  4  1 
2011-04-08 feb  4  2  4 
      jan  1  7  6 
2011-04-11 feb  0  3  8 
      jan  5  6  7 
2011-04-12 feb  4  0  2 
      jan  3  9  3 
2011-04-13 feb  0  3  9 
      jan  0  1  0 

df.columns = df.columns.str.lower() 
df['new'] = 1 

df = df.unstack().swaplevel(0,1,1).sort_index(axis=1) 
print (df) 
       feb     jan    
      amount name new price amount name new price 
2011-03-31  0 5 1  6  7 3 1  2 
2011-04-01  4 2 1  0  2 5 1  6 
2011-04-04  7 9 1  2  0 7 1  9 
2011-04-05  9 9 1  7  3 5 1  5 
2011-04-06  6 3 1  1  4 4 1  1 
2011-04-07  6 7 1  9  7 4 1  1 
2011-04-08  4 2 1  4  1 7 1  6 
2011-04-11  0 3 1  8  5 6 1  7 
2011-04-12  4 0 1  2  3 9 1  3 
2011-04-13  0 3 1  9  0 1 1  0 

別の解決策が作成され、新しいMultiIndexと新しい列concatのための新しいDataFrame元へ:

a = df.columns.get_level_values(0) 
b = df.columns.get_level_values(1).str.lower() 
df.columns = pd.MultiIndex.from_arrays([a,b]) 

mux = pd.MultiIndex.from_product([a.unique(),['new']]) 
df1 = pd.DataFrame(1, columns=mux, index=df.index) 
print (df1) 
      jan feb 
      new new 
2011-03-31 1 1 
2011-04-01 1 1 
2011-04-04 1 1 
2011-04-05 1 1 
2011-04-06 1 1 
2011-04-07 1 1 
2011-04-08 1 1 
2011-04-11 1 1 
2011-04-12 1 1 
2011-04-13 1 1 

df = pd.concat([df, df1], axis=1).sort_index(axis=1) 
print (df) 
       feb     jan    
      amount name new price amount name new price 
2011-03-31  0 5 1  6  7 3 1  2 
2011-04-01  4 2 1  0  2 5 1  6 
2011-04-04  7 9 1  2  0 7 1  9 
2011-04-05  9 9 1  7  3 5 1  5 
2011-04-06  6 3 1  1  4 4 1  1 
2011-04-07  6 7 1  9  7 4 1  1 
2011-04-08  4 2 1  4  1 7 1  6 
2011-04-11  0 3 1  8  5 6 1  7 
2011-04-12  4 0 1  2  3 9 1  3 
2011-04-13  0 3 1  9  0 1 1  0 
関連する問題