我有两个数据帧,一个连接到2或4个节点元素的节点,另一个包含有关节点的数据。我希望基于其连接节点的数据平均元素的数据。
这是元素数据框。 n1,n2,n3,n4对应于该元素上的节点 和eID是元素ID。该元素可以有2个或4个节点,可以有空白的“n”字段:
eID n1 n2 n3 n4
0 1 4
1 4 1
2 2 7 3 6
3 1 9 8 1
4 3 4 6 3
包含节点数据的数据框。 nodeID列表示元素框架中任何“n”列中的每个节点:
nodeID dx dy dz
0 88.340153 -88.340153 23.234556
1 66.370153 -66.370153 23.632464
2 76.422513 -74.423513 11.245715
3 22.333573 -32.328673 55.345354
4 14.123763 -74.322413 14.637526
我想通过简单地对元素上所有节点的节点dx,dy和dz求平均值来为每个元素设置平均dx,dy和dz。
所需的元素数据帧(只要我有数据,我就可以删除n1,n2 ......列)
eID avg_dx avg_dy avg_dz
0 88.340153 -88.340153 23.234556
1 66.370153 -66.370153 23.632464
2 76.422513 -74.423513 11.245715
3 22.333573 -32.328673 55.345354
4 14.123763 -74.322413 14.637526
到目前为止我尝试过的事情:
# col is the n1, n2, n3,n4
# node frame is the dataframe of nodal data.
for col in node_col_list:
element_node_relate = element_node_relate.merge(node_frame, left_on=col, right_index=True)
# drop _x and _y suffixes from merge
element_node_relate.columns = element_node_relate.columns.map(lambda x: x.replace('_x', ''))
element_node_relate.columns = element_node_relate.columns.map(lambda x: x.replace('_y', ''))
# drop "n" columns to just leave deflection data
element_node_relate = element_node_relate[[col for col in element_node_relate.columns if not regexn.match(col)]]
# final averaging of deflection data
element_node_relate = element_node_relate.groupby(element_node_relate.columns, axis=1).mean()
# apply "avg_" to columns to indicate averaged data
element_node_relate.columns = element_node_relate.columns.map(lambda x: "avg_" + x)
我遇到的问题是,当我合并帧时,循环遍历n列并合并:
for col in node_col_list: # this is the n1, n2, n3,n4
element_node_relate = element_node_relate.merge(node_frame, left_on=col, right_index=True)
我原来的element_node_relate数据帧正在丢弃数据。即,条目数每次减少很多。我不打算删除“n”字段为空的条目。
我希望通过熊猫这是一种更简单的方法。
感谢任何帮助!
谢谢,
躯
答案 0 :(得分:1)
鉴于你的两个框架:
In [21]: df1
Out[21]:
eID n1 n2 n3 n4
0 0 1 4 NaN NaN
1 1 4 1 NaN NaN
2 2 2 7 3 6
3 3 1 9 8 1
4 4 3 4 6 3
In [22]: df2
Out[22]:
nodeID dx dy dz
0 0 88.340153 -88.340153 23.234556
1 1 66.370153 -66.370153 23.632464
2 2 76.422513 -74.423513 11.245715
3 3 22.333573 -32.328673 55.345354
4 4 14.123763 -74.322413 14.637526
我认为一种更好的方法是将df1重塑为“长期”,而不是循环和合并。格式,使用melt
。
In [26]: df1_melt = pd.melt(df1, id_vars='eID').dropna()
In [27]: df1_melt
Out[27]:
eID variable value
0 0 n1 1
1 1 n1 4
2 2 n1 2
3 3 n1 1
4 4 n1 3
5 0 n2 4
6 1 n2 1
7 2 n2 7
8 3 n2 9
9 4 n2 4
12 2 n3 3
13 3 n3 8
14 4 n3 6
17 2 n4 6
18 3 n4 1
19 4 n4 3
然后,从那里,你可以加入你的另一个框架并总结你想要的。
In [28]: df1_merge = df1_melt.merge(df2, left_on='value', right_on='nodeID')
In [29]: df1_merge.groupby('eID')[['dx','dy','dz']].mean()
Out[29]:
dx dy dz
eID
0 40.246958 -70.346283 19.134995
1 40.246958 -70.346283 19.134995
2 49.378043 -53.376093 33.295535
3 66.370153 -66.370153 23.632464
4 19.596970 -46.326586 41.776078