转换多索引数据框并按位置更改二级索引

Posted

技术标签:

【中文标题】转换多索引数据框并按位置更改二级索引【英文标题】:Transforming Multindex Dataframe and change second level index by position 【发布时间】:2020-06-26 12:14:27 【问题描述】:

我有一个多索引数据框,其中索引中有两个日期。每个日期组合都有 A、B、C、D 列的值。

    tradedate          deliverydate            A        B        C      D
2017-09-15 00:00:00    2017-09-11 00:00:00     31.84    27.61   32.3    46.57
                       2017-09-18 00:00:00     39       41.33   42.13   51.655
                       2017-09-25 00:00:00     39.75    40.5    42.89   56.135
                       2017-10-02 00:00:00     41.25    37.85   43.375  54.725
                       2017-10-09 00:00:00     46       40.72   47.875  54.475
2017-09-18 00:00:00    2017-09-11 00:00:00     32.04    28.94   34.18   49.295
                       2017-09-18 00:00:00     40.2     41.615  42.945  50.71
                       2017-09-25 00:00:00     40       39.55   41.815  54.125
                       2017-10-02 00:00:00     41.75    37.265  43.99   52.975
                       2017-10-09 00:00:00     44.75    40.615  48.5    54.285
                       2017-10-16 00:00:00     51.12    42.875  52.625  54.475

我想通过将级别 2 中的交货日期替换为位置,然后使用列名和位置创建列来解决多索引问题。

位置如下所示:

    tradedate         position     A     B      C       D
2017-09-15 00:00:00    0          31.84  27.61  32.3    46.57
                       1          39     41.33  42.13   51.655
                       2          39.75  40.5   42.89   56.135
                       3          41.25  37.85  43.375  54.725
                       4          46     40.72  47.875  54.475
2017-09-18 00:00:00    0          32.04  28.94  34.18   49.295
                       1          40.2   41.615 42.945  50.71
                       2          40     39.55  41.815  54.125
                       3          41.75  37.265 43.99   52.975
                       4          44.75  40.615 48.5    54.285
                       5          51.12  42.875 52.625  54.475

最终的数据帧应该没有多重索引,看起来像这样:

    tradedate        A_0    A_1    A_2      A_3     A_4     A_5     B_0     …   D_4      D_5
2017-09-15 00:00:00 31.84   39     39.75    41.25   46       -      27.61   …   54.475  
2017-09-18 00:00:00 32.04   40.2   40       41.75   44.75   51.12   28.94   …   54.285  54.475

有人可以帮我完成这些转换吗?

【问题讨论】:

【参考方案1】:

这样可以:

new_df = (df.reset_index(level=1, drop=True)
   .set_index(df.groupby(level=0).cumcount(), append=True) # this is your step 1
   .unstack(level=1)
)

# rename columns
new_df.columns = [f'x_y' for x,y in new_df.columns]

# reset_index
new_df = new_df.reset_index()

样本数据:

df = (pd.DataFrame('a':['x']*4+['y']*3,
                  'b':[8,8,8,9,7,7,7],
                  'A':[1,2,3,4,5,6,7],
                  'B':[7,6,5,4,3,2,1])
        .set_index(['a','b'])
     )

输出:

   a  A_0  A_1  A_2  A_3  B_0  B_1  B_2  B_3
0  x  1.0  2.0  3.0  4.0  7.0  6.0  5.0  4.0
1  y  5.0  6.0  7.0  NaN  3.0  2.0  1.0  NaN

【讨论】:

我通常认为第二级索引的每个第一个索引都有唯一的编号,所以 df.unstack() 就足够了! @Bharath 我也会更喜欢多索引列/索引。额外的步骤是为了匹配 OP 的预期输出,这有时是他/她工作中的实际要求。

以上是关于转换多索引数据框并按位置更改二级索引的主要内容,如果未能解决你的问题,请参考以下文章

使用索引值列表对 pandas 多索引数据框进行切片 [重复]

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]

多索引表 创建多索引表

多索引上的 Pandas TimeGrouper

如何更改多索引数据框中的索引