Python 堆栈列对
我有一个熊猫数据框,大约有100列,类型如下: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
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