2017-05-01 3 views
2

Possible duplicatesしかし、そこに提供される解決策は、私が得た情報のために私の問題に合わないことがあります。パンダ:上部に依存するインデックスにサブレベルを追加します

アイデアはかなりシンプルです。 (私は唯一のデータフレームを取得し、私の場合、私はインデックスを構築しませんでした)私は、マルチレベルの行列があります。

#test = (('2','C'),('2','B'),('1','A')) 
#test = pd.MultiIndex.from_tuples(test) 
#pandas.dataFrame(index=test, columns=test) 
     2    1 
     C  B  A 
2 C NaN  NaN  NaN 
    B NaN  NaN  NaN 
1 A NaN  NaN  NaN 

私はAの機能に2つの軸上のサブレベルを追加したいと思い、 B、CEG:

  2    1 
      C  B  A 
      kg  kg  m3 
2 C kg NaN  NaN  NaN 
    B kg NaN  NaN  NaN 
1 A m3 NaN  NaN  NaN 

現実にはインデックスが(私はそれを構築していない)DATAFRAMEを通して利用可能であり、私はこれだけ知っている:{ 'C': 'キロ'、 'B': 'キロを'、' A ':' m3 '}。私は、インデックスシリーズを取得し、上記のリンクに似たアプローチを使用することができますが、それは非常に遅く、私は何かがより簡単でより効果的であると想像することはできません。

+0

ちょっとCyril、あなたの例ではデータフレームを作成できません。 –

+0

はい、動作します。しかし、私はコマンド 'pd.DataFrame(np.zeros((3,3))、index = test、columns = test)'または 'pd.DataFrame(index = test、columns = test)'を追加するのを忘れていました。私の問題に不可欠です。このコードは私の真のケースでインデックスを構築していないので、ここでも役に立たない。私は単なるユニットのインデックスを持っています。 – Cyril

答えて

1

出典DF:

In [303]: df 
Out[303]: 
     2   1 
     C B A 
2 C NaN NaN NaN 
    B NaN NaN NaN 
1 A NaN NaN NaN 

ソリューション:

In [304]: cols = df.columns 

In [305]: new_lvl = [d[c] for c in df.columns.get_level_values(1)] 

In [306]: df.columns = pd.MultiIndex.from_arrays([cols.get_level_values(0), 
                cols.get_level_values(1), 
                new_lvl]) 

In [307]: df 
Out[307]: 
     2   1 
     C B A 
     kg kg m3 
2 C NaN NaN NaN 
    B NaN NaN NaN 
1 A NaN NaN NaN 

dは次のとおりです。

In [308]: d = {'C':'kg', 'B':'kg', 'A':'m3'} 

In [309]: d 
Out[309]: {'A': 'm3', 'B': 'kg', 'C': 'kg'} 
+0

簡単で簡単です。ありがとう。 – Cyril

+0

@Cyril、歓迎です:) – MaxU

0
新しいインデックスに追加する set_index(..., append=True)を使用することができます

youtは

test = (('2','C'),('2','B'),('1','A')) 
test = pd.MultiIndex.from_tuples(test) 
x = pd.DataFrame(index=test, columns=test) 

# add new index 
x['new'] = pd.Series(x.index.get_level_values(-1), index=x.index).replace({'C':'kg', 'B':'kg', 'A':'m3'}) 
x.set_index('new', append=True, inplace=True) 
x.index.names = [None] * 3 

# transpose dataframe and do the same thing 
x = x.T 
x['new'] = pd.Series(x.index.get_level_values(-1), index=x.index).replace({'C':'kg', 'B':'kg', 'A':'m3'}) 
x.set_index('new', append=True, inplace=True) 
x.index.names = [None] * 3 
x = x.T 
関連する問題