2016-02-22 25 views
2

我正在嘗試使用索引索引製作一個熊貓數據框的seaborn facet plot。第一個代碼塊生成一個類似於數據集我有將具有分層列索引的寬型熊貓數據框轉換爲整齊格式

from itertools import product, repeat 
import pandas as pd 
import numpy as np 
from pandas import DataFrame, Series 
import seaborn as sns 
import matplotlib.pyplot as plt 

dummy = np.random.random((4, 4)) 

cols = pd.MultiIndex.from_tuples(list(product('ab', 'cd')), 
           names=['foo', 'bar']) 
dat1 = DataFrame(dummy, columns=cols) 

它看起來像

foo   a     b   
bar   c   d   c   d 
0 0.266058 0.345076 0.339332 0.176753 
1 0.094610 0.393542 0.838283 0.314625 
2 0.598301 0.831869 0.277067 0.854321 
3 0.910993 0.688163 0.158744 0.570700 

,不與FacetGrid工作的工作---至少,它不是在FacetGrid希望與之合作。我可以做數據

dfs = [DataFrame([Series(dummy[:, i], name='obs'), 
        Series(list(repeat(cols.values[i][0], 4)), name='foo'), 
        Series(list(repeat(cols.values[i][1], 4)), name='bar')],).T 
     for i in range(4)] 
dat2 = pd.concat(dfs) 

一些快速和骯髒的操作讓它看起來像

  obs foo bar 
0 0.266058 a c 
1 0.0946101 a c 
2 0.598301 a c 
3 0.910993 a c 
0 0.345076 a d 
1 0.393542 a d 
2 0.831869 a d 
3 0.688163 a d 
0 0.339332 b c 
1 0.838283 b c 
2 0.277067 b c 
3 0.158744 b c 
0 0.176753 b d 
1 0.314625 b d 
2 0.854321 b d 
3  0.5707 b d 

它看起來像從seaborn example gallery數據。我的問題是,是否有一個DataFrame或Index方法來爲我進行這種轉換。它似乎應該存在,但我還沒有在文檔中找到它。

回答

2

這似乎工作:

dat1.unstack().reset_index(["foo", "bar"], name="obs") 


    foo bar  obs 
0 a c 0.716688 
1 a c 0.945587 
2 a c 0.388928 
3 a c 0.597745 
0 a d 0.201622 
1 a d 0.267941 
2 a d 0.575878 
3 a d 0.632626 
0 b c 0.143869 
1 b c 0.499576 
2 b c 0.860764 
3 b c 0.369183 
0 b d 0.857490 
1 b d 0.048870 
2 b d 0.804838 
3 b d 0.230868 
+0

就像一個魅力。謝謝。 – Elliot

相關問題