2016-11-16 13 views
2

シリーズ/ DATAFRAMEパンダする:(固定値)のレベルを付加すると、以下のようにIマルチインデックスを持つパンダシリーズを有する

import pandas as pd 
import numpy as np 
idx = pd.MultiIndex.from_product([['A','C'],range(5)], names=['category_1','number']) 
np.random.seed(0) 
s = pd.Series(index=idx, data = np.random.randn(len(idx))) 

I:

category_1 number 
A   0   1.764052 
      1   0.400157 
      2   0.978738 
      3   2.240893 
      4   1.867558 
C   0  -0.977278 
      1   0.950088 
      2  -0.151357 
      3  -0.103219 
      4   0.410599 

これは、このコードから生成されます

category_1 category_2 number 
A   D   0   1.764052 
         1   0.400157 
         2   0.978738 
         3   2.240893 
         4   1.867558 
C   D   0  -0.977278 
         1   0.950088 
         2  -0.151357 
         3  -0.103219 
         4   0.410599 
:別のレベルを追加したい、次の結果を持っている固定値(すなわち D)とインデックスに category_2と呼ばれます私はこれを行うには、このハックの方法を使用している

df =s.to_frame('dummy') 
df['category_2'] = 'D' 
df.set_index('category_2', append = True, inplace = True) 
df = df.reorder_levels([0,2,1]) 
res = df['dummy'] 

パンダシリーズ/データフレーム上の既存のレベルに固定値とレベルを追加するためのより良い(より簡潔/神託)方法はありますか?

答えて

2
あなたは新しい MultiIndexを作成し、古いものを置き換える必要

#change multiindex 
new_index = list(zip(s.index.get_level_values('category_1'), 
        ['D'] * len(s.index), 
        s.index.get_level_values('number'))) 
print (new_index) 
[('A', 'D', 0), ('A', 'D', 1), 
('A', 'D', 2), ('A', 'D', 3), 
('A', 'D', 4), ('C', 'D', 0), 
('C', 'D', 1), ('C', 'D', 2), 
('C', 'D', 3), ('C', 'D', 4)] 
s.index = pd.MultiIndex.from_tuples(new_index, 
            names=['category_1','category_2','number']) 
print (s) 
category_1 category_2 number 
A   D   0   1.764052 
         1   0.400157 
         2   0.978738 
         3   2.240893 
         4   1.867558 
C   D   0  -0.977278 
         1   0.950088 
         2  -0.151357 
         3  -0.103219 
         4   0.410599 
dtype: float64 

MultiIndex.from_productのもう一つの素敵な解決策を - ビットがcommentを変更:

s.index = pd.MultiIndex.from_product([s.index.levels[0], 
             ['D'], 
             s.index.levels[1]], names= ['c1','c2','number']) 
print (s) 
c1 c2 number 
A D 0   1.764052 
     1   0.400157 
     2   0.978738 
     3   2.240893 
     4   1.867558 
C D 0  -0.977278 
     1   0.950088 
     2  -0.151357 
     3  -0.103219 
     4   0.410599 
dtype: float64 

または:

s.index = pd.MultiIndex.from_product([s.index.get_level_values('category_1').unique(), 
             ['D'], 
             s.index.get_level_values('number').unique()], 
            names= ['c1','c2','number']) 
print (s) 
c1 c2 number 
A D 0   1.764052 
     1   0.400157 
     2   0.978738 
     3   2.240893 
     4   1.867558 
C D 0  -0.977278 
     1   0.950088 
     2  -0.151357 
     3  -0.103219 
     4   0.410599 
dtype: float64 
+0

おかげで、別の方法はfrom_productを使用することです:s.index = pd.MultiIndex.from_product([s.inde – motam79

+0

ニース、私のために 's.index = pdが動作します。x.levels [0]、 'D'、s.index.levels [1]]、names = ['c1'、 'c2'、 'number']) MultiIndex.from_product([s.index.levels [0]、['D']、s.index.levels [1]]、names = ['c1'、 'c2'、 'number']) ' – jezrael

関連する問題