使用shape或pivot_table(堆叠每一行)重新塑造熊猫数据帧



我有一个几乎令人尴尬的简单问题,我自己都想不出来。

这里有一个玩具示例来演示我想做什么,假设我有一个简单的数据帧:

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.spivot_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)

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

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

为这样一个琐碎的问题道歉。

使用numpy.reshape来重塑DataFrame:中的底层数据

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

最新更新