Skip to main content
 首页 » 编程设计

Python之逆透视数据

2025年05月04日16mayingbao

寻找 python 解决方案。在 python 中取消旋转数据框时需要帮助。对于我想要 reshape 它的基本枢轴函数,该结构有点时髦。

当前数据框 - 这是我所拥有的

ABC Mechanical               
 
              Standard  15-Day  10-Day  5-Day 
Terminal Units  0.49    0.75    0.69    0.63 
Diffusers       0.35    0.55    0.45    0.4 
Vent            0.8     0.95    0.9     0.85 
Piping          0.7     0.85    0.8     0.75 
Stoves          0.6     0.8     0.75    0.7 

UNPIVOTED DATA FRAME - 这是我想 reshape 它的方式

df.columns= Customer, Product Category, Ship Cycle, Multiplier 
df.index= ABC Mechanical  
 
Customer    Product Category    Ship Cycle  Multiplier 
ABC Mechanical  Terminal Units  Standard    0.49 
ABC Mechanical  Terminal Units  15-Day      0.75 
ABC Mechanical  Terminal Units  10-Day      0.69 
ABC Mechanical  Terminal Units  5-Day       0.63 
ABC Mechanical  Diffusers       Standard    0.35 
ABC Mechanical  Diffusers       15-Day      0.55 
ABC Mechanical  Diffusers       10-Day      0.45 
ABC Mechanical  Diffusers       5-Day       0.4 

非常感谢任何帮助!

谢谢!

请您参考如下方法:

如果 df 看起来像这样:

In [26]: df 
Out[26]:  
                Standard  15-Day  10-Day  5-Day 
Terminal Units      0.49    0.75    0.69   0.63 
Diffusers           0.35    0.55    0.45   0.40 
Vent                0.80    0.95    0.90   0.85 
Piping              0.70    0.85    0.80   0.75 
Stoves              0.60    0.80    0.75   0.70 

然后 pd.melt 让您接近所需的 DataFrame:

In [27]: pd.melt(df.reset_index(), id_vars=['index']).sort_values(by=['index']) 
Out[27]:  
             index  variable  value 
1        Diffusers  Standard   0.35 
6        Diffusers    15-Day   0.55 
11       Diffusers    10-Day   0.45 
16       Diffusers     5-Day   0.40 
3           Piping  Standard   0.70 
8           Piping    15-Day   0.85 
13          Piping    10-Day   0.80 
18          Piping     5-Day   0.75 
4           Stoves  Standard   0.60 
9           Stoves    15-Day   0.80 
14          Stoves    10-Day   0.75 
19          Stoves     5-Day   0.70 
0   Terminal Units  Standard   0.49 
5   Terminal Units    15-Day   0.75 
10  Terminal Units    10-Day   0.69 
15  Terminal Units     5-Day   0.63 
2             Vent  Standard   0.80 
7             Vent    15-Day   0.95 
12            Vent    10-Day   0.90 
17            Vent     5-Day   0.85 

我不明白“ABC Mechanical”在原始 DataFrame 中的位置,因此我没有尝试将其包含在结果中。列名可以这样重命名:

In [28]: df = pd.melt(df.reset_index(), id_vars=['index']).sort_values(by=['index']) 
In [29]: df.columns = ['Product Category', 'Ship Cycle', 'Multiplier'] 
In [31]: df.head() 
Out[31]:  
   Product Category Ship Cycle  Multiplier 
1         Diffusers   Standard        0.35 
6         Diffusers     15-Day        0.55 
11        Diffusers     10-Day        0.45 
16        Diffusers      5-Day        0.40 
3            Piping   Standard        0.70