【问题标题】:Stack and concatenate dataframes, with given index level and sorting order使用给定的索引级别和排序顺序堆叠和连接数据帧
【发布时间】:2020-07-28 09:58:29
【问题描述】:

我正在尝试将具有相同索引和列的简单数据帧重塑和连接成一个更大的数据帧。 比如说我有两个数据集,一个测量 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 的相应数据。 我尝试了各种 .stack() 和 .swaplevel(),然后沿轴 1 连接,但我总是最终使用 .sort_index(),它不保留顺序“zak”。知道如何有效地执行此操作吗?

【问题讨论】:

    标签: pandas


    【解决方案1】:

    在DataFrames 中使用concat 和DataFrame.unstack,最后设置索引名称为DataFrame.rename_axis:

    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
    

    【讨论】:

      【解决方案2】:

      确实是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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 2017-05-20
        • 2020-06-03
        • 2013-10-13
        • 2016-11-08
        • 2018-10-09
        相关资源
        最近更新 更多