熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引

Posted

技术标签:

【中文标题】熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引【英文标题】:pandas transform 1st mutliindex to rowindex and 2nd multiindex to columnindex 【发布时间】:2021-08-28 03:33:11 【问题描述】:

所以我有以下代码将给定数据帧的组转换为列并计算每个组的大小。这将创建一个具有一列和两个值的 Multiindex 的 DataFrame。然后我将结果转换为将第二个索引作为 columnindex 并将第一个索引作为 rowindex。

import pandas as pd
from random import choice

products=['car', 'pen', 'kitchen', 'bed']
df=pd.DataFrame(['product': choice(products), 'Changing': choice([True, False]) for _ in range(10000)])

df_grp=df.groupby(['product', 'Changing']).size().to_frame()
print(df_grp)
print('-'*50)

d=[]
for i in df_grp.reset_index()['product'].unique():
    d.append('product':i, 'not changing': df_grp.loc[(i,False)][0], 'changing': df_grp.loc[(i,True)][0])
print(pd.DataFrame(d).set_index('product'))

这会产生以下输出

                     0
product Changing      
bed     False     1253
        True      1269
car     False     1244
        True      1275
kitchen False     1236
        True      1271
pen     False     1206
        True      1246
--------------------------------------------------
         not changing  changing
product                        
bed              1253      1269
car              1244      1275
kitchen          1236      1271
pen              1206      1246

这正是我想要实现的。但是,我的方法似乎有点复杂。有没有更优雅的方法来做到这一点?也许使用 da 内置的 pandas 函数或 lambda 函数?此外,我的方法不能很好地概括,因为我总是假设第二个索引是布尔值。

【问题讨论】:

【参考方案1】:

通过unstack()尝试:

df_grp=df.groupby(['product', 'Changing']).size().unstack()

终于使用columns属性:

df_grp.columns=[f'"not "*coldf_grp.columns.name' for col in df_grp][::-1]
#as suggested by @Cyttorak #rename column without hard coding
#OR
df_grp.columns=['not changing','changing'] #you have to manually write the names

df_grp的输出:

          not changing  changing
product         
bed         1210        1226
car         1220        1272
kitchen     1238        1277
pen         1267        1290

【讨论】:

我删除了我的。您可以添加(如果需要)可以在不使用硬封装的情况下重命名列:df_grp.columns = [f'"not "*coldf_grp.columns.name' for col in df_grp] 好吧,考虑到它几乎是一样的,我不介意你添加这部分。一个全面的答案比两个几乎相似的答案要好。

以上是关于熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引的主要内容,如果未能解决你的问题,请参考以下文章

熊猫使用多索引选择第二个索引的最后一行

如何将多索引列转换为熊猫数据框的单索引列?

访问熊猫数据框中内部多索引级别的最后一个元素

ValueError 将多索引熊猫数据框转换为 Excel

如何将熊猫数据框转换为多索引数据框

3维numpy数组到多索引熊猫数据框