web-dev-qa-db-ja.com

マルチカラムfrom_tuplesを実行する方法は?

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

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

_                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
_

フォームに

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

どうもありがとう。


編集:タプル列ヘッダーがある理由は、シングルレベル列のDataFrameをマルチレベル列のDataFrameに結合すると、マルチ列が文字列のタプル形式に変わったためです。単一のレベルを単一の文字列として残しました。


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

10

columnsに直接割り当て、結果は pd.MultiIndex.from_tuples 既存の列を渡す:

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

次のように、names属性のcolumns属性に直接割り当てることができることに注意してください。

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

name属性と混同しないでください

16
EdChum

別の解決策は使用です MultiIndex.from_tuples パラメータnames

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

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