Python 堆栈列对

Python 堆栈列对,python,pandas,stack,reshape,lreshape,Python,Pandas,Stack,Reshape,Lreshape,我有一个熊猫数据框,大约有100列,类型如下: X1 Y1 X2 Y2 X3 Y3 0.78 0.22 0.19 0.42 0.04 0.65 0.43 0.29 0.43 0.84 0.14 0.42 0.57 0.70 0.59 0.86 0.11 0.40 0.92 0.52 0.81 0.33 0.54

我有一个熊猫数据框,大约有100列,类型如下:

X1       Y1      X2      Y2      X3      Y3
 0.78    0.22    0.19    0.42    0.04    0.65 
 0.43    0.29    0.43    0.84    0.14    0.42 
 0.57    0.70    0.59    0.86    0.11    0.40 
 0.92    0.52    0.81    0.33    0.54    1.00 
这里(X,Y)基本上是成对的值

我需要从上面创建以下内容

   X     Y
 0.78    0.22 
 0.43    0.29 
 0.57    0.70 
 0.92    0.52 
 0.19    0.42 
 0.43    0.84 
 0.59    0.86 
 0.81    0.33 
 0.04    0.65 
 0.14    0.42 
 0.11    0.40 
 0.54    1.00 
i、 e.堆叠奇数编号的所有X列,然后堆叠偶数编号的所有Y列

我甚至不知道从哪里开始。对于少量的列,我可以很容易地使用列名。

对于列名,可以使用
列表理解

x = [col for col in df.columns if 'X' in col]
y = [col for col in df.columns if 'Y' in col]

df = pd.lreshape(df, {'X': x,'Y': y})
print (df)
       X     Y
0   0.78  0.22
1   0.43  0.29
2   0.57  0.70
3   0.92  0.52
4   0.19  0.42
5   0.43  0.84
6   0.59  0.86
7   0.81  0.33
8   0.04  0.65
9   0.14  0.42
10  0.11  0.40
11  0.54  1.00
具有
多索引的解决方案
和:


还值得注意的是,您可以使用X-Y值显式地构造一个新的数据帧。这很可能更快,但它假设X-Y列对是数据帧的全部

pd.DataFrame(dict(X=df.values[:,::2].reshape(-1),
                  Y=df.values[:,1::2].reshape(-1)))
演示

>>> pd.DataFrame(dict(X=df.values[:,::2].reshape(-1),
                      Y=df.values[:,1::2].reshape(-1)))

       X     Y
0   0.78  0.22
1   0.19  0.42
2   0.04  0.65
3   0.43  0.29
4   0.43  0.84
5   0.14  0.42
6   0.57  0.70
7   0.59  0.86
8   0.11  0.40
9   0.92  0.52
10  0.81  0.33
11  0.54  1.00

您可以使用文档化的
pd.wide\u to\u long
,但您需要使用“虚拟”列来唯一标识每一行。您可以稍后删除此列

pd.wide_to_long(df.reset_index(), 
                stubnames=['X', 'Y'], 
                i='index', 
                j='dropme').reset_index(drop=True)

       X     Y
0   0.78  0.22
1   0.43  0.29
2   0.57  0.70
3   0.92  0.52
4   0.19  0.42
5   0.43  0.84
6   0.59  0.86
7   0.81  0.33
8   0.04  0.65
9   0.14  0.42
10  0.11  0.40
11  0.54  1.00

这是不好的。lreshape是否已经实现,并且可以在不导入任何模块的情况下使用?是的,它在很久以前就已经实现了,但仍然没有仅用源代码进行记录。
pd.wide_to_long(df.reset_index(), 
                stubnames=['X', 'Y'], 
                i='index', 
                j='dropme').reset_index(drop=True)

       X     Y
0   0.78  0.22
1   0.43  0.29
2   0.57  0.70
3   0.92  0.52
4   0.19  0.42
5   0.43  0.84
6   0.59  0.86
7   0.81  0.33
8   0.04  0.65
9   0.14  0.42
10  0.11  0.40
11  0.54  1.00