2016-06-15 5 views
5

私はMulti-Column from_tuplesを実行するには?

   Value 
Caps Lower  
A a   1 
B a   2 
B b   3 

しかし、どのように、私は、フォーム

 (A, a) (A, b) (B,a) (B,b) 
index 
1  1  2  2  3 
2  2  3  3  2 
3  3  4  4  1 

形で列のタプルを変更するかに

 Value 
(A,a) 1 
(B,a) 2 
(B,b) 3 

のようなものを変更するためにpd.MultiIndex.from_tuples()を使用する方法を取得します

Caps   A    B 
Lower  a  b  a  b 
index 
1   1  2  2  3 
2   2  3  3  2 
3   3  4  4  1 

多くのありがとうございます。


編集: Iはタプル列ヘッダーを持っている理由は、私はマルチレベル列を持つデータフレームにシングルレベルカラムとデータフレームに加わったときに、それはのタプルに複数列になっていることです文字列フォーマットを使用し、単一レベルを単一文字列として残しました。


編集2 - 代替ソリューション:ここでの問題を述べたように、列レベルの大きさが異なるとjoinを経て生まれました。これは、Multi-Columnが文字列のタプルに縮小されたことを意味していました。この問題を回避するには、参加する前に、私が参加したいDataFrameにdf.columns = [('col_level_0','col_level_1','col_level_2')]を使用しました。

答えて

7

割り当ては、既存の列に渡しpd.MultiIndex.from_tuplesから結果とcolumnsに直接:

df.columns.names = ['Caps','Lower'] 

:あなたは次のようにcolumns属性のnames属性に直接割り当てることができます

In [186]: 
l=[('A', 'a'), ('A', 'b'), ('B','a'), ('B','b')] 
df = pd.DataFrame(np.random.randn(5,4), columns = l) 
df 

Out[186]: 
    (A, a) (A, b) (B, a) (B, b) 
0 -0.876353 0.553742 1.631858 -0.561309 
1 0.463058 -0.455014 -0.491336 -1.436059 
2 0.337810 0.233624 -0.571749 -2.259763 
3 1.073057 -0.475894 0.999643 -0.379743 
4 0.441800 0.311202 -0.191552 0.291268 

In [187]:  
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower']) 
df 

Out[187]: 
Caps   A     B   
Lower   a   b   a   b 
0  -0.876353 0.553742 1.631858 -0.561309 
1  0.463058 -0.455014 -0.491336 -1.436059 
2  0.337810 0.233624 -0.571749 -2.259763 
3  1.073057 -0.475894 0.999643 -0.379743 
4  0.441800 0.311202 -0.191552 0.291268 

ノートname属性と混同しないでください。

+0

[OK]を、多分私はインデックスのためにそれを使用する方法を理解していないか、他の私は希望必要とされた微妙な変化を実現しました。今私はもう少しよく理解していると思います!ありがとうございました。 – josh

+0

@Edchum、私はそれが 'from_tuples'関数のパラメータを持つ私のソリューションを公平にコピーしていないと思う - [改訂版](http://stackoverflow.com/posts/37835622/revisions参照)。しかしそれはあなた次第です。がんばろう! – jezrael

+0

名前の属性を追加のステップとして設定するのは余計なようでしたが、根本的な点が事実であるので名前付けの手順を無視すると、これら2つの回答の間にはほとんど違いがないと思うにもかかわらず、 OPは列タプル名を階層インデックス – EdChum

2
import pandas as pd 

df = pd.DataFrame({'Value': [1,2,3]}, index=[('A','a'),('B','a'),('B','b')]) 
print (df) 
     Value 
(A, a)  1 
(B, a)  2 
(B, b)  3 

df.index = pd.MultiIndex.from_tuples(df.index, names=['Caps','Lower']) 
print (df) 
      Value 
Caps Lower  
A a   1 
B a   2 
    b   3 

columnsでこれと同じ作品は、Edchum's answer参照:別の解決策は、パラメータnamesで使用MultiIndex.from_tuplesある

df.columns= pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower']) 
+0

はい、私が失敗したのは、 'df.index'ではなく' df.columns'に割り当てる必要があったのですが、これは 'df.index = pd.MultiIndex.from_tuples(df.index =インデックス) 'など。ありがとう。 – josh

+0

うれしいことが、幸運を助けることができます! – jezrael

関連する問題