如何将索引拆分为多索引,如下所示?

2024-10-03 23:17:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的excel文件,有数千行和大约100列。问题是,索引列包括大约50个指标(销售、房屋、人员)和70家公司。我真正想要的是有两个指标,一个是指标,一个是公司。以以下代码为例:

import pandas as pd
import numpy as np
idx=['Sales','Company 1', 'Company 2', 'Company 3','Houses','Company 1',     
'Company 2', 'Company 3','People','Company 1', 'Company 2', 'Company 3']
dt=['2010','2011','2012','2013']
data = np.array([np.arange(12)]*4).T
df = pd.DataFrame(data, index=idx, columns=dt)
df.iloc[4,::]=0;df.iloc[8,::]=0 
df

结果看起来像附加的图像 enter image description here

我的问题是如何操作数据框,以便第一个索引是Sales,Sales,Sales….而第二个索引是Company 1,Company 2,Company 3 for each metric(Sales,Houses等等)


Tags: importdfdataasnpdt公司指标
1条回答
网友
1楼 · 发布于 2024-10-03 23:17:37

设置

c = 3 # number of companies
metrics = df.index[::c+1]
companies = df.index[1:c+1]

这个答案只是获取度量,找到公司,创建一个MultiIndex并重新分配。它基于一个假设:公司在每个指标之间的顺序相同:

idx = pd.MultiIndex.from_product([metrics, companies])
df.drop(df.index[::c+1]).set_index(idx)

                  2010  2011  2012  2013
Sales  Company 1     1     1     1     1
       Company 2     2     2     2     2
       Company 3     3     3     3     3
Houses Company 1     5     5     5     5
       Company 2     6     6     6     6
       Company 3     7     7     7     7
People Company 1     9     9     9     9
       Company 2    10    10    10    10
       Company 3    11    11    11    11

如果你不能保证这个约束,它会变得有点棘手:

u = pd.Series(df.index)
idx = u.groupby(u.index // (c + 1)).transform('first') + '|' + u
f = df.drop(df.index[::c+1])
f[['metric', 'company']] = (idx.drop(idx.index[::c+1])
                               .str.split('|', expand=True).set_index(f.index))    
f.set_index(['metric', 'company'])

                  2010  2011  2012  2013
metric company
Sales  Company 1     1     1     1     1
       Company 2     2     2     2     2
       Company 3     3     3     3     3
Houses Company 1     5     5     5     5
       Company 2     6     6     6     6
       Company 3     7     7     7     7
People Company 1     9     9     9     9
       Company 2    10    10    10    10
       Company 3    11    11    11    11

相关问题 更多 >