2016-04-05 2 views
4

私はのようになりますパンダのDATAFRAMEていなく、マルチインデックス列にメルト:私は基本的にはデータフレームをmeltしたいパンダは、手動で指定レベル(Pythonの3.5.1)

df = pd.DataFrame({'col1': {0: 'a', 1: 'b', 2: 'c'}, 
        'col2': {0: 1, 1: 3, 2: 5}, 
        'col3': {0: 2, 1: 4, 2: 6}, 
        'col4': {0: 3, 1: 6, 2: 2}, 
        'col5': {0: 7, 1: 2, 2: 3}, 
        'col6': {0: 2, 1: 9, 2: 5}, 
        }) 
df.columns = [list('AAAAAA'), list('BBCCDD'), list('EFGHIJ')] 


    A 
    B  C  D 
    E F G H I J 
0 a 1 2 3 7 2 
1 b 3 4 6 2 9 
2 c 5 6 2 3 5 

をするように、各列レベルが新しい列になります。言い換えれば、私はpd.melt()と私はかなり単純に欲しいものを達成することができます:

pd.melt(df, value_vars=[('A', 'B', 'E'), 
         ('A', 'B', 'F'), 
         ('A', 'C', 'G'), 
         ('A', 'C', 'H'), 
         ('A', 'D', 'I'), 
         ('A', 'D', 'J')]) 

しかし、私の本当のユースケースには、そこに多くの初期の列が(6よりも多く)であり、場合、それは素晴らしいことです私はこの一般化可能にすることができたので、正確にタプルをvalue_varsに指定する必要はありませんでした。一般化可能な方法でこれを行う方法はありますか?私は基本的にpd.meltにちょうどvalue_varsをタプルのリストに設定したいと言う方法を探しています。各タプルで最初の要素が最初の列レベルで、2番目が2番目の列レベルで、3番目の要素が3番目の列レベル。

答えて

2

あなたがvalue_varsを指定しない場合、(id_varsとして指定されていない)すべての列がデフォルトで使用されています

In [10]: pd.melt(df) 
Out[10]: 
    variable_0 variable_1 variable_2 value 
0   A   B   E  a 
1   A   B   E  b 
2   A   B   E  c 
3   A   B   F  1 
4   A   B   F  3 
... 

しかし、何らかの理由では、列のリストを生成する必要がない場合組は、df.columns.tolist()を使用できます:

In [57]: df.columns.tolist() 
Out[57]: 
[('A', 'B', 'E'), 
('A', 'B', 'F'), 
('A', 'C', 'G'), 
('A', 'C', 'H'), 
('A', 'D', 'I'), 
('A', 'D', 'J')] 

In [56]: pd.melt(df, value_vars=df.columns.tolist()) 
Out[56]: 
    variable_0 variable_1 variable_2 value 
0   A   B   E  a 
1   A   B   E  b 
2   A   B   E  c 
3   A   B   F  1 
4   A   B   F  3 
... 
関連する問題