Pandas 熊猫:将行转换为列,并将所有其他条目设为第二列

Pandas 熊猫:将行转换为列,并将所有其他条目设为第二列,pandas,Pandas,我有这样一个熊猫数据框: Col1 Col2 Col3 Col4 control x1 x2 x3 x4 obs1 o11 o12 o13 o14 obs2 o21 o22 o23 o24 ... obsn on1 on2 on3 on4 我想按如下方式对其进行重塑(不需要列标题): 我该怎么做呢?我想我有一个粗略的解决方案,但它并不优雅。假

我有这样一个熊猫数据框:

            Col1  Col2  Col3  Col4
control      x1    x2    x3    x4
obs1         o11   o12   o13   o14
obs2         o21   o22   o23   o24
...
obsn         on1   on2   on3   on4      
我想按如下方式对其进行重塑(不需要列标题):


我该怎么做呢?

我想我有一个粗略的解决方案,但它并不优雅。假设
df
是我的数据帧

mdf = df.melt()
for col in df.columns:
    mdf.loc[mdf['variable'] == col, 'variable'] = df.loc['control', col]

mdf.drop(mdf[mdf['variable'] == mdf['value']].index, inplace=True)

您可以选择您的“控制”行,并使用该行通过
set\u axis
设置列,从那里可以进行简单的
melt

sort_值
reset_索引
在功能上是不必要的,但它们将
dataframe
与您的预期输出对齐,因此我将它们包括在这里:

control = df.loc["control", :]
observations = df.drop("control")

out = (observations.set_axis(control, axis=1)
       .melt(value_name="observation")
       .sort_values("observation")
       .reset_index(drop=True))

print(out)
  control observation
0      x1         o11
1      x2         o12
2      x3         o13
3      x4         o14
4      x1         o21
5      x2         o22
6      x3         o23
7      x4         o24
control = df.loc["control", :]
observations = df.drop("control")

out = (observations.set_axis(control, axis=1)
       .melt(value_name="observation")
       .sort_values("observation")
       .reset_index(drop=True))

print(out)
  control observation
0      x1         o11
1      x2         o12
2      x3         o13
3      x4         o14
4      x1         o21
5      x2         o22
6      x3         o23
7      x4         o24