【问题标题】:Pandas unstack with multiindex columnsPandas 使用多索引列取消堆叠
【发布时间】:2021-01-26 23:35:12
【问题描述】:

我有一个 pandas 数据框,可以通过以下方式创建:

pd.DataFrame([[1,'a','green'],[2,'b','blue'],[2,'b','green'],[1,'e','green'],[2,'b','blue']], columns  = ['sales','product','color'], index = ['01-01-2020','01-01-2020','01-02-2020','01-03-2020','01-04-2020'])

看起来像:

我想使用“颜色”功能取消堆叠数据框,并按 [green,blue],[sales,product] 的乘积创建一个多索引,并将现有列作为列多索引的第二级。数据框的索引是日期。可以使用代码创建我想要的结果数据框:

pd.DataFrame([[1,'a',2,'b'],[2,'b',np.nan,np.nan],[1,'e',np.nan,np.nan],[np.nan,np.nan,2,'b']],columns = pd.MultiIndex.from_product([['green','blue'],['sales','product']]), index = ['01-01-2020','01-02-2020','01-03-2020','01-04-2020'])

看起来像:

请注意,由于通用日期索引,生成的数据框将比原始数据框短。

在我的一生中,我一直无法弄清楚如何正确旋转/取消堆叠来解决这个问题。我正在尝试将其应用于非常大的数据框,因此性能对我来说是关键。非常感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe pivot


    【解决方案1】:

    试试这个:

    df.set_index('color', append=True).unstack().swaplevel(0, 1, axis=1).sort_index(axis=1)
    

    输出:

    color         blue         green      
               product sales product sales
    01-01-2020       b   2.0       a   1.0
    01-02-2020     NaN   NaN       b   2.0
    01-03-2020     NaN   NaN       e   1.0
    01-04-2020       b   2.0     NaN   NaN
    

    详情:

    • 使用 append=True 将“颜色”添加到现有索引中
    • 取消堆叠最里面的索引级别,“颜色”以将其添加到列中
    • 交换多索引列标题级别并排序

    正如@QuangHoang 所说:

    df.set_index('color', append=True).stack().unstack([1,2])
    

    哪个更快,

    每个循环 4.13 毫秒 ± 274 微秒(平均值 ± 标准偏差,7 次运行,每次 100 次循环)

    每个循环 2.78 ms ± 44.7 µs(平均值 ± 标准偏差,7 次运行,每次 100 个循环)

    【讨论】:

    • 还有:df.set_index('color', append=True).stack().unstack(level=(1,2)).
    猜你喜欢
    • 2013-11-09
    • 2016-09-06
    • 2022-12-21
    • 2016-12-08
    • 2023-01-11
    • 2019-02-14
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多