2016-11-24 23 views
2

我有以下数据结构:拼合在多指标大熊猫数据帧一一对一映射

from collections import OrderedDict 
import pandas as pd 

d = OrderedDict([ 
    ((5, 3, 1), {'y1': 1}), 
    ((5, 3, 2), {'y2': 2}), 
    ((5, 4, 1), {'y1': 10}), 
    ((5, 4, 2), {'y2': 20}), 

    ((6, 3, 1), {'y1': 100}), 
    ((6, 3, 2), {'y2': 200}), 
    ((6, 4, 1), {'y1': 1000}), 
    ((6, 4, 2), {'y2': 2000}), 
]) 

df = pd.DataFrame(
    d.values(), 
    index=pd.MultiIndex.from_tuples(d.keys(), names=['x3', 'x2', 'x1']), 
) 

表看起来像

  y1 y2 
x3 x2 x1    
5 3 1  1 NaN 
     2 NaN  2 
    4 1  10 NaN 
     2 NaN 20 
6 3 1 100 NaN 
     2 NaN 200 
    4 1 1000 NaN 
     2 NaN 2000 

正如你可以看到有一个单对一的x1和列之间的映射(X1 = 1:Y1,X1 = 2:Y2),我想变平成为

  y1 y2 
x3 x2    
5 3  1  2 
    4  10 20 
6 3 100 200 
    4 1000 2000 

如何做呢?

编辑:或者反过来:

   y 
x3 x2 x1    
5 3 1  1 
     2  2 
    4 1  10 
     2  20 
6 3 1 100 
     2 200 
    4 1 1000 
     2 2000 
+0

你尝试过这么远吗? – Roman

回答

2

可以使用stack为删除NaN,因为创建Series,通过reset_index删除third水平最后由unstack重塑:

print (df.stack().reset_index(level=2,drop=True).unstack(2)) 
      y1  y2 
x3 x2     
5 3  1.0  2.0 
    4  10.0 20.0 
6 3 100.0 200.0 
    4 1000.0 2000.0 

如果需要转换为int添加astype

print (df.stack().reset_index(level=2,drop=True).unstack(2).astype(int)) 
     y1 y2 
x3 x2    
5 3  1  2 
    4  10 20 
6 3 100 200 
    4 1000 2000 

编辑:

print (df.stack().reset_index(level=3,drop=True).to_frame('y').astype(int)) 
      y 
x3 x2 x1  
5 3 1  1 
     2  2 
    4 1  10 
     2  20 
6 3 1 100 
     2 200 
    4 1 1000 
     2 2000 
+0

这符合我的需求,谢谢。也许你也知道一种相反的方式(参见我的编辑)。 – fhgd

+0

我自己找到了答案:'df.stack()。reset_index(level = 3,drop = True).to_frame('y')' – fhgd

+0

抱歉,我离线。请参阅编辑。 – jezrael

0
df2 = df.unstack() 
df2.columns = range(4) 
df3 = df2.drop([1,2], axis=1) 
df3.columns = ["Y1", "Y2"] 
df3 

enter image description here