将DataFrame组添加为数据列

时间:2014-06-26 15:00:34

标签: python pandas

我一直在努力寻找一种方法来重塑我的数据帧。我是Python的新手,不熟悉数据帧的所有方法。特别是转动。我已多次阅读文档但仍未找到解决方案。

(以下数据是随机的)

我的原始数据被拉入数据框,如下所示:

        ShellSurface         S1         S2  ElementHID  sx  sy  sz        sxy  
    0              1  88.340153 -88.340153         144   0   0   0  15.225413   
    1              1  66.370153 -66.370153         144   0   0   0  21.447455   
    2              1  74.422513 -74.422513         144   0   0   0  88.114254   
    3              1  22.324573 -22.324573         144   0   0   0  74.370153   
    4              2  14.322413 -14.322413         144   0   0   0  11.114425

每个元素有3个表面,元素是四边形,因此它们有4个单独的条目需要在文件中进行平均。我用frame.groupby(['ElementHID','ShellSurface'])。mean()来完成这个。

新框架:

                                      S1           S2   sx  sy  sz          sxy  
    ElementHID ShellSurface                                                      
    144        1               22.310153   -22.310153   0   0   0    21.445778   
               2               17.114552   -17.114552   0   0   0    11.114452   
               3               79.370153   -79.370153   0   0   0    19.311443 

问题是我需要每个表面中的数据列(将表面编号附加到标题),并将元素作为行。所以我需要下面的列格式:

    ElementHID    S11    S12   S13   sx1   sx2  sx3  sy1  sy2  sy3  sxy1  sxy2  sxy3

我以前这样做的方法是创建一个元素类,并为每个曲面赋予它我的数据列的属性,但它似乎不是最有效的方法。我希望有一种方法可以在熊猫中实现这一目标。

我还堆叠了数据,这为我提供了一种简单的方法来循环遍历每个表面的数据,但我仍然不确定如何使用它来重塑数据。

1 个答案:

答案 0 :(得分:1)

从分组数据开始,将索引重置为列。

df = frame.groupby(['ElementHID','ShellSurface']).mean().reset_index()

您可以使用pivot_table来重塑数据。索引定义了哪些变量定义了'行'表的列和列定义了哪些变量应该转换为列。

In [233]: pivoted = df.pivot_table(index=['ElementHID'], columns=['ShellSurface'])
In [234]: pivoted
Out[234]: 
                     S1                    S2             sx     sy     sz     ...
ShellSurface          1          2          1          2   1  2   1  2   1  2   
ElementHID                                                                      
144           62.864348  14.322413 -62.864348 -14.322413   0  0   0  0   0  0   

数据透视表将具有MultiIndex列,您可以相对直观地访问组,例如:

In [235]: pivoted['S1'][1]
Out[235]: 
ElementHID
144           62.864348
Name: 1, dtype: float64

或者,如果要折叠到已连接的列名列表,可以执行以下操作。

In [239]: pivoted.columns = [''.join((lvl1, str(lvl2))) for lvl1,lvl2 in pivoted.columns]
In [240]: pivoted
Out[240]: 
                  S11        S12        S21        S22  sx1  sx2  sy1  sy2  ...
ElementHID                                                                   
144         62.864348  14.322413 -62.864348 -14.322413    0    0    0    0