在一个密钥存在的数据帧和另一个密钥存在的数据帧之间求平均值

2024-04-28 21:24:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,一个节点连接到2或4节点元素,另一个包含关于节点的数据。我希望根据元素所连接节点的数据来平均元素的数据

这是元素dataframe。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)

我的原始元素节点关联数据帧正在删除数据。i、 条目的数量每次都减少了不少。我不想删除“n”字段为空的条目

我希望有一个更简单的方法可以通过熊猫做到这一点

感谢您的帮助

谢谢你


Tags: columns数据node元素节点colelementavg
1条回答
网友
1楼 · 发布于 2024-04-28 21:24:13

考虑到你的两个框架:

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

我认为更好的方法不是循环和合并,而是使用melt将df1重塑为“long”格式

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

相关问题 更多 >