我有一个几乎令人尴尬的简单问题,我自己也无法弄明白。
这是一个玩具示例,用于演示我想要做什么,假设我有这个简单的数据框:
df = pd.DataFrame([[1,2,3,4,5,6],[7,8,9,10,11,12]],index=range(2),columns=list('abcdef'))
a b c d e f
0 1 2 3 4 5 6
1 7 8 9 10 11 12
我想要的是堆叠它,以便它采用以下形式,其中列标识符已被更改(到X和Y),以便它们对于所有重新堆叠的值是相同的:
X Y
0 1 2
3 4
5 6
1 7 8
9 10
11 12
我很确定你可以使用pd.stack()或pd.pivot_table()来完成,但我已经阅读了文档,但无法弄清楚如何操作。但是,我不想将所有列附加到下一行的末尾,而只是想从每一行追加一对(或实际值的三元组)值。
只是为我想要做的事情添加一些肉体;
df = pd.DataFrame(np.random.randn(3,6),index=range(3),columns=list('abcdef'))
a b c d e f
0 -0.168636 -1.878447 -0.985152 -0.101049 1.244617 1.256772
1 0.395110 -0.237559 0.034890 -1.244669 -0.721756 0.473696
2 -0.973043 1.784627 0.601250 -1.718324 0.145479 -0.099530
我希望将其重新堆叠到此表单中(其中列标签已再次更改,所有值都相同):
X Y Z
0 -0.168636 -1.878447 -0.985152
-0.101049 1.244617 1.256772
1 0.395110 -0.237559 0.034890
-1.244669 -0.721756 0.473696
2 -0.973043 1.784627 0.601250
-1.718324 0.145479 -0.099530
是的,可以在每一行上运行以下逻辑进行for循环:
df.values.reshape(df.shape[1]/3,2)
但是你必须单独计算每一行,而我的实际数据有数万行。
所以我想有选择地堆叠每一行(例如,通过成对的值或三元组),然后基本上为整个数据帧堆叠该行堆栈。最好一次在整个数据框上完成(如果可能的话)。
为这样一个微不足道的问题道歉。
答案 0 :(得分:2)
使用numpy.reshape重塑数据框中的基础数据:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,6),index=range(3),columns=list('abcdef'))
print(df)
# a b c d e f
# 0 -0.889810 1.348811 -1.071198 0.091841 -0.781704 -1.672864
# 1 0.398858 0.004976 1.280942 1.185749 1.260551 0.858973
# 2 1.279742 0.946470 -1.122450 -0.355737 1.457966 0.034319
result = pd.DataFrame(df.values.reshape(-1,3),
index=df.index.repeat(2), columns=list('XYZ'))
print(result)
产量
X Y Z
0 -0.889810 1.348811 -1.071198
0 0.091841 -0.781704 -1.672864
1 0.398858 0.004976 1.280942
1 1.185749 1.260551 0.858973
2 1.279742 0.946470 -1.122450
2 -0.355737 1.457966 0.034319