我有一个以下格式的现有数据框(让我们称之为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
应该让我得到总和,但我仍然坚持第一步。
答案 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