我有一个几乎令人尴尬的简单问题,我自己都想不出来。
这里有一个玩具示例来演示我想做什么,假设我有一个简单的数据帧:
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