Pandas 使用给定的索引级别和排序顺序堆叠和连接数据帧

Pandas 使用给定的索引级别和排序顺序堆叠和连接数据帧,pandas,Pandas,我正在尝试将具有相同索引和列的简单数据帧重新塑造并合并为一个更大的数据帧。 例如,我有两个数据集,一个测量t: In [8]: df1 Out[8]: z a k 2010 t0 t1 t2 2011 t3 t4 t5 2012 t6 t7 t8 2013 t9 t10 t11 和另一个测量p: In [10]: df2 Out[10]: z a k 2010 p0 p1 p2 2011 p

我正在尝试将具有相同索引和列的简单数据帧重新塑造并合并为一个更大的数据帧。 例如,我有两个数据集,一个测量t:

In [8]: df1
Out[8]: 
       z    a    k
2010  t0   t1   t2
2011  t3   t4   t5
2012  t6   t7   t8
2013  t9  t10  t11
和另一个测量p:

In [10]: df2
Out[10]: 
       z    a    k
2010  p0   p1   p2
2011  p3   p4   p5
2012  p6   p7   p8
2013  p9  p10  p11
我想创建这个数据帧:

    ...: df3
Out[11]: 
               t's    p's
stats dates          
z     2010   NaN  NaN
      2011   NaN  NaN
      2012   NaN  NaN
      2013   NaN  NaN
a     2010   NaN  NaN
      2011   NaN  NaN
      2012   NaN  NaN
      2013   NaN  NaN
k     2010   NaN  NaN
      2011   NaN  NaN
      2012   NaN  NaN
      2013   NaN  NaN
显然是t和p的相应数据。
我尝试了使用.swaplevel()的各种.stack(),然后沿轴1进行连接,但我总是使用.sort_index(),它不保留“zak”的顺序。知道如何有效地执行此操作吗?

确实是
stack
swaplevel
,但您需要一些额外的功能:

(df1.stack().to_frame(name='t\'s')
    .join(df2.stack().to_frame(name='p\'s'))
    .swaplevel(0,1)
    .sort_index()
)
输出:

        t's  p's
a 2010   t1   p1
  2011   t4   p4
  2012   t7   p7
  2013  t10  p10
k 2010   t2   p2
  2011   t5   p5
  2012   t8   p8
  2013  t11  p11
z 2010   t0   p0
  2011   t3   p3
  2012   t6   p6
  2013   t9   p9
DataFrame
s一起使用,最后设置索引名的方法是:

df = pd.concat([df1.unstack(), 
                df2.unstack()], axis=1, keys=('t\'s','p\'s')).rename_axis(['stats','dates'])
print (df)
             t's  p's
stats dates          
z     2010    t0   p0
      2011    t3   p3
      2012    t6   p6
      2013    t9   p9
a     2010    t1   p1
      2011    t4   p4
      2012    t7   p7
      2013   t10  p10
k     2010    t2   p2
      2011    t5   p5
      2012    t8   p8
      2013   t11  p11