【问题标题】:Pandas multi-level index to rowsPandas 对行的多级索引
【发布时间】:2015-11-04 21:25:21
【问题描述】:

我正在尝试转换此 DataFrame:

>>> df
D1     D2  
S1 S2  S1 S2
0  -4  1  -6
1  -5  2  -7
3  -8  3  -9

类似于:

>>> df
    0    1    2    3
D1  -4   -5   NaN  -8
D2  NaN  -6   -7   -9

基本上(D1,S1)(D2,S1)列中的值需要合并到列名中,(D1,S2)(D2,S2)列中的值成为唯一的数据值。

我怎样才能简单有效地做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    所需的 DataFrame 在索引中有Ds。 stack 将列级值移动到索引中。所以很自然会想到打电话给stack

    In [43]: result = df.stack(level=0); result
    Out[43]: 
          S1  S2
    0 D1   0  -4
      D2   1  -6
    1 D1   1  -5
      D2   2  -7
    2 D1   3  -8
      D2   3  -9
    

    所需的DataFrame在索引中只有Ds,所以让我们删除外层值:

    In [44]: result.index = result.index.droplevel(0); result
    Out[44]: 
        S1  S2
    D1   0  -4
    D2   1  -6
    D1   1  -5
    D2   2  -7
    D1   3  -8
    D2   3  -9
    

    我们现在希望S1 列成为列级别的值。这可以通过首先将S1 列移动到索引中来完成,

    In [45]: result = result.set_index('S1', append=True); result
    Out[45]: 
           S2
       S1    
    D1 0   -4
    D2 1   -6
    D1 1   -5
    D2 2   -7
    D1 3   -8
    D2 3   -9
    

    然后调用unstack将索引级别移动到列级别:

    In [46]: result = result.unstack('S1'); result
    Out[46]: 
        S2          
    S1   0  1   2  3
    D1  -4 -5 NaN -8
    D2 NaN -6  -7 -9
    

    综合起来,

    import pandas as pd
    df = pd.DataFrame({('D1', 'S1'): [0, 1, 3],
     ('D1', 'S2'): [-4, -5, -8],
     ('D2', 'S1'): [1, 2, 3],
     ('D2', 'S2'): [-6, -7, -9]})
    
    result = df.stack(level=0)
    result.index = result.index.droplevel(0)
    result = result.set_index('S1', append=True)
    result = result.unstack('S1')
    result.columns = result.columns.droplevel(0)
    print(result)
    

    产量

    S1   0  1   2  3
    D1  -4 -5 NaN -8
    D2 NaN -6  -7 -9
    

    供参考:四个基本的DataFrame重塑操作是

    它们是基本的,因为 DataFrame 只是一个具有索引和列的数组 水平。这些运算符允许您将值从数组移动到索引级别 到列级别并返回。以各种方式将这 4 种操作结合​​起来可以 解决了很多DataFrame reshaping问题。

    【讨论】:

      猜你喜欢
      • 2015-07-08
      • 2020-11-16
      • 2018-07-08
      • 1970-01-01
      • 2019-10-27
      • 2018-07-09
      • 2013-11-09
      • 2019-06-13
      • 2017-06-09
      相关资源
      最近更新 更多