考虑以下示例资料:
Month  Location  Products    Sales  Profit
JAN      1        43          32     20  
JAN      2        82          54     25
JAN      3        64          43     56
FEB      1        37          28     78
FEB      2        18          15     34
FEB      3        5           2      4
MAR      1        47          40     14
我试图实作的多索引转换是这样的:
          JAN                     FEB                     MAR
Location  Products Sales Profit   Products Sales Profit   Products Sales Profit
1         43       32    29       37       28    78       47       40    14
2         82       54    25       18       15    34       null     null  null
3         64       43    56       5        2     4        null     null  null
我试过这个版本:
df.stack().to_frame().T
它将所有资料放在一行中。所以,这不是目标。
我想我很接近,因为它应该是堆栈或拆开,融化或不融化,但我的尝试在这一点上都导致了资料燕麦片。感谢您尝试解决这个问题的时间。
uj5u.com热心网友回复:
使用pivot:
>>> df.pivot('Location', 'Month').swaplevel(axis=1).sort_index(axis=1)
Month         FEB                   JAN                   MAR             
         Products Profit Sales Products Profit Sales Products Profit Sales
Location                                                                  
1            37.0   78.0  28.0     43.0   20.0  32.0     47.0   14.0  40.0
2            18.0   34.0  15.0     82.0   25.0  54.0      NaN    NaN   NaN
3             5.0    4.0   2.0     64.0   56.0  43.0      NaN    NaN   NaN
要保留 order,您必须Month像CategoricalDtype以前一样转换列:
df['Month'] = df['Month'].astype(pd.CategoricalDtype(df['Month'].unique(), ordered=True))
out = df.pivot('Location', 'Month').swaplevel(axis=1).sort_index(axis=1)
print(out)
# Output:
Month         JAN                   FEB                   MAR             
         Products Profit Sales Products Profit Sales Products Profit Sales
Location                                                                  
1            43.0   20.0  32.0     37.0   78.0  28.0     47.0   14.0  40.0
2            82.0   25.0  54.0     18.0   34.0  15.0      NaN    NaN   NaN
3            64.0   56.0  43.0      5.0    4.0   2.0      NaN    NaN   NaN
更新 2
尝试强制级别 2 列的顺序:
df1 = df.set_index(['Month', 'Location'])
df1.columns = pd.CategoricalIndex(df1.columns, ordered=True)
df1 = df1.unstack('Month').swaplevel(axis=1).sort_index(axis=1)
uj5u.com热心网友回复:
您可以pivot与reorder_levels和一起  使用sort_index():
df.pivot(index='Location',columns='Month').reorder_levels(order=[1,0],axis=1).sort_index(axis=1)
Month         FEB                   JAN                   MAR             
         Products Profit Sales Products Profit Sales Products Profit Sales
Location                                                                  
1            37.0   78.0  28.0     43.0   20.0  32.0     47.0   14.0  40.0
2            18.0   34.0  15.0     82.0   25.0  54.0      NaN    NaN   NaN
3             5.0    4.0   2.0     64.0   56.0  43.0      NaN    NaN   NaN
如果您有兴趣,这个答案在swaplevel和之间进行了详细说明reoder_levels。

 
							 
										
										 
										
										 
										
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										 
										
										
0 评论