使用单独的数据帧将多索引映射到现有的pandas数据帧列

时间:2018-04-18 21:49:34

标签: python pandas indexing

我有一个以下格式的现有数据框(让我们称之为df):

               A     B     C     D
0              1     2     1     4
1              3     0     2     2
2              1     5     3     1

列名是从具有以下格式的电子表格中提取的(我们称之为cat_df):

                      current category
broader category
X                     A
Y                     B
Y                     C
Z                     D

首先,我想提前一个更高级别的索引,使df看起来像这样:

               X     Y           Z
               A     B     C     D
0              1     2     1     4
1              3     0     2     2
2              1     5     3     1

最后,我想通过对子索引求和来将数据“汇总”到元索引中,以生成如下所示的新数据框:

               X     Y     Z
0              1     3     4
1              3     2     2
2              1     8     1

使用this answer中的concat让我接近,但看起来这是一个非常手动的过程,挑选出每个子集。我真正的数据集有一个更复杂的映射,所以我想在构建我的元索引时直接引用它。我想一旦我得到元索引,一个简单的groupby应该让我得到总和,但我仍然坚持第一步。

3 个答案:

答案 0 :(得分:2)

IIUC,你可以这样做。

df.columns = pd.MultiIndex.from_tuples(cat_df.reset_index()[['broader category','current category']].apply(tuple, axis=1).tolist())

打印(DF)

输出:

   X  Y     Z
   A  B  C  D
0  1  2  1  4
1  3  0  2  2
2  1  5  3  1

总和水平:

df.sum(level=0, axis=1)

输出:

   X  Y  Z
0  1  3  4
1  3  2  2
2  1  8  1

答案 1 :(得分:2)

d = dict(zip(cat_df['current category'], cat_df.index))

cols = pd.MultiIndex.from_arrays([df.columns.map(d.get), df.columns])
df.set_axis(cols, axis=1, inplace=False)

   X  Y     Z
   A  B  C  D
0  1  2  1  4
1  3  0  2  2
2  1  5  3  1
df_new = df.set_axis(cols, axis=1, inplace=False)
df_new.groupby(axis=1, level=0).sum()

   X  Y  Z
0  1  3  4
1  3  2  2
2  1  8  1

答案 2 :(得分:2)

您可以使用set_index创建idx,然后分配给您的df

idx=df1.set_index('category',append=True).index

df.columns=idx

df
Out[1170]:
current   X  Y     Z
category  A  B  C  D
0         1  2  1  4
1         3  0  2  2
2         1  5  3  1

df.sum(axis=1,level=0)
Out[1171]: 
current  X  Y  Z
0        1  3  4
1        3  2  2
2        1  8  1