使用shape或pivot_table重新整形pandas数据框(堆叠每一行)

时间:2014-01-05 02:06:34

标签: python pandas stack reshape

我有一个几乎令人尴尬的简单问题,我自己也无法弄明白。

这是一个玩具示例,用于演示我想要做什么,假设我有这个简单的数据框:

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)

但是你必须单独计算每一行,而我的实际数据有数万行。

所以我想有选择地堆叠每一行(例如,通过成对的值或三元组),然后基本上为整个数据帧堆叠该行堆栈。最好一次在整个数据框上完成(如果可能的话)。

为这样一个微不足道的问题道歉。

1 个答案:

答案 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