我一直在努力寻找一种方法来重塑我的数据帧。我是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
我以前这样做的方法是创建一个元素类,并为每个曲面赋予它我的数据列的属性,但它似乎不是最有效的方法。我希望有一种方法可以在熊猫中实现这一目标。
我还堆叠了数据,这为我提供了一种简单的方法来循环遍历每个表面的数据,但我仍然不确定如何使用它来重塑数据。
答案 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