对Pandas数据帧之间的值求平均值,其中密钥存在于一个中,而数据存在于另一个中

时间:2014-09-22 15:08:13

标签: python pandas

我有两个数据帧,一个连接到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”字段为空的条目。

我希望通过熊猫这是一种更简单的方法。

感谢任何帮助!

谢谢,

1 个答案:

答案 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