2017-05-23 10 views
3

こんにちは私は2レベルのマルチインデックスと1つのカラムを持つDataFrame/Seriesを持っています。私は2番目のレベルのインデックスを取得し、それを列として使用したいと考えています。例えば、(multi-index docsから取られたコード):2番目のインデックスを列として使用して、パンダのマルチインデックスシリーズをデータフレームに変換する

import pandas as pd 
import numpy as np 

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 
tuples = list(zip(*arrays)) 
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) 
s = pd.DataFrame(np.random.randn(8), index=index, columns=["col"]) 

次のようになります。

first second 
bar one  -0.982656 
     two  -0.078237 
baz one  -0.345640 
     two  -0.160661 
foo one  -0.605568 
     two  -0.140384 
qux one  1.434702 
     two  -1.065408 
dtype: float64 

は、私が希望することは、インデックスと列[one, two]とのデータフレームを持つことです。

答えて

7

あなたはちょうどあなたのシリーズをunstackする必要があります。

>>> s.unstack(level=1) 
second  one  two 
first      
bar -0.713374 0.556993 
baz  0.523611 0.328348 
foo  0.338351 -0.571854 
qux  0.036694 -0.161852 
+1

これもまた – s5s

2

ここで整形配列使用してソリューションです - あなたは、インデックスの一番上に表示される名前を気にしない場合は

>>> idx = s.index.levels 
>>> c = len(idx[1]) 
>>> pd.DataFrame(s.values.reshape(-1,c),index=idx[0].values, columns=idx[1].values) 
      one  two 
bar 2.225401 1.624866 
baz 1.067359 0.349440 
foo -0.468149 -0.352303 
qux 1.215427 0.429146 

を -

>>> pd.DataFrame(s.values.reshape(-1,c), index=idx[0], columns=idx[1]) 
second  one  two 
first      
bar  2.225401 1.624866 
baz  1.067359 0.349440 
foo -0.468149 -0.352303 
qux  1.215427 0.429146 

指定されたデータセットのタイミングのタイミング -

# @AChampion's solution 
In [201]: %timeit s.unstack(level=1) 
1000 loops, best of 3: 444 µs per loop 

# Using array reshaping step-1 
In [199]: %timeit s.index.levels 
1000000 loops, best of 3: 214 ns per loop 

# Using array reshaping step-2  
In [202]: %timeit pd.DataFrame(s.values.reshape(-1,2), index=idx[0], columns=idx[1]) 
10000 loops, best of 3: 47.3 µs per loop 
+1

の「s.columns = s.columns.droplevel(0)」でした。これは私が常に検討するオプションです。すべての指標がすべてのレベルに存在するとは限らない場合は、それはうんざりしています。言い換えれば、マルチインデックスはデカルト積を表すものではありません。 – piRSquared

関連する問題