我从以下DataFrame
开始:
df_1 = DataFrame({
"Cat1" : ["a", "b"],
"Vals1" : [1,2] ,
"Vals2" : [3,4]
})
df
我想让它看起来像这样:
我可以用这段代码来做到这一点:
df_2 = (
pd.melt(df_1, id_vars=["Cat1"])
.T
)
df_2.columns = (
pd.MultiIndex
.from_tuples(
list(zip(df_2.loc["Cat1", :] , df_2.loc["variable", :])) ,
names=["Cat1", None]
)
)
df_2 = (
df_2
.loc[["value"], :]
.reset_index(drop=True)
.sortlevel(0, axis=1)
)
df_2
但是这里有太多的步骤,我觉得代码闻到了,或者至少是模糊的不是熊猫惯用的东西,好像我错过了API中的某些东西。对基于行的索引执行等效操作只需一步,例如,通过set_index()
。 (请注意,我知道相当于set_index()
is still an open issue的列。有没有更好,更官方的方式来做到这一点?
答案 0 :(得分:11)
您可以使用stack()
,to_frame()
和T
进行转置。
df_1.set_index('Cat1').stack().to_frame().T
Cat1 a b
Vals1 Vals2 Vals1 Vals2
0 1 3 2 4
答案 1 :(得分:2)
将其视为转置数据框。你走了:
df.set_index('Cat1').unstack().swaplevel().sort_index().to_frame().T
Out[46]:
Cat1 a b
Vals1 Vals2 Vals1 Vals2
0 1 3 2 4