Python 将数据帧转换为其他布局

Python 将数据帧转换为其他布局,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据帧: column1 column2 column3 0 A 0.020 0.76 1 B 0.045 1.30 2 C 0.230 0.32 3 D 0.130 0.67 column1 newCol A column2 0.020 column3 0.760 B column2 0.045

我有一个如下所示的数据帧:

  column1  column2  column3
0       A    0.020     0.76
1       B    0.045     1.30
2       C    0.230     0.32
3       D    0.130     0.67
column1  newCol 
A        column2    0.020
         column3    0.760
B        column2    0.045
         column3    1.300
C        column2    0.230
         column3    0.320
D        column2    0.130
         column3    0.670
Name: value, dtype: float64
我想修改此dataframe结构,使其如下所示:

  column1  column2  column3
0       A    0.020     0.76
1       B    0.045     1.30
2       C    0.230     0.32
3       D    0.130     0.67
column1  newCol 
A        column2    0.020
         column3    0.760
B        column2    0.045
         column3    1.300
C        column2    0.230
         column3    0.320
D        column2    0.130
         column3    0.670
Name: value, dtype: float64
其中,
column1
column2
column3
newCol
是列的名称 A、 B、C、D是行的唯一值


我的问题是,我不知道如何在新的数据帧中将
column1
column2
从列转换为行。

使用
melt
+
设置索引
+
排序索引
-

df.melt('column1', var_name='newCol')\
  .set_index(['column1', 'newCol'])\
  .sort_index().value

column1  newCol 
A        column2    0.020
         column3    0.760
B        column2    0.045
         column3    1.300
C        column2    0.230
         column3    0.320
D        column2    0.130
         column3    0.670
Name: value, dtype: float64

适用于
v0.20
及以上版本。对于旧版本,请改用
pd.melt

column1
设置为索引、堆栈和重命名索引列:

>>> res = df.set_index('column1').stack()
>>> res.index.names = ['column1', 'newCol']
>>> res

column1  newCol 
A        column2    0.020
         column3    0.760
B        column2    0.045
         column3    1.300
C        column2    0.230
         column3    0.320
D        column2    0.130
         column3    0.670
dtype: float64

非常感谢。你的解决方案非常有效。但我还有一个问题。让我们假设在初始数据帧中有几个相同的行。第1列、第2列和第3列的值相同。在应用您的解决方案之前,我可以在整个数据帧中使用.drop_副本,但我想知道您是否可以在代码中以某种方式集成该副本,从而以不同的方式完成它。@user9160422问得好。我认为最有效的方法是先去掉重复的
df.drop_duplicates().melt('column1',var_name='newCol')。set_index(['column1','newCol'])。sort_index().value
。重塑操作(如堆栈和熔化)成本较高,因此传递给这些函数的数据越少越好。对不起,错误单击了两次:)谢谢!你的解决方案也奏效了。但是,我希望将newCol作为column2,column3的列标题,而不是value.OK。我以为你想要数据帧作为结果。更新我的答案以获得一个系列。