首页 > 解决方案 > 数据框中的质量中心按行排列,并将每列乘以不同的质量

问题描述

我正在尝试计算 20 个物体的质心,其中每个物体都有自己不同的质量。

这些对象在 dataframe 中表示cm_x,它们的关联质量在列表中。为了节省空间,下面我只展示了这 20 个对象中的 3 个。每个对象都有一个x, y, z坐标,但我只显示坐标,x然后我可以将相同的技术应用于其余对象。下面是数据框的头部。

bar_head_x  bar_hip_centre_x    bar_left_ankle_x
0   -203.3502   -195.4573   -293.262
1   -203.4280   -195.4720   -293.251
2   -203.4954   -195.4675   -293.248
3   -203.5022   -195.9193   -293.219
4   -203.5014   -195.9092   -293.328

m_head = 0.081
m_hipc = 0.139
m_lank = 0.0465
m = [m_head,m_hipc,m_lank] 

我在另一个类似的问题中看到,有人提出了这种方法,但是这并没有包含大众,这就是我遇到问题的地方:

def series_sum(pd_series):
    return np.sum(np.dot(pd_series.values, np.asarray(range(1, len(pd_series)+1)))/np.sum(pd_series))

cm_x.apply(series_sum, axis=1)

基本上我希望每一行都有一个相关的质心,使用的质心公式是sum(x_i * m_i) / sum(m_i).

所需的结果将是数据框中的新列,如下所示:

cm_x
0   -214.92
1   ...
2   ...
3   ...
4   ...

有什么帮助吗?

标签: pythonpandasapply

解决方案


使用DataFrame.dot并除以sum列表m

s = df.dot(m).div(sum(m))
print (s)
0      -214.921628
1      -214.951023
2      -214.968638
3      -215.201292
4      -215.214800
7441   -245.078910
7442   -244.943961
7443   -244.806606
7444   -244.665285
7445   -244.533503
dtype: float64

如果需要DataFrame添加Series.to_frame

df1 = df.dot(m).div(sum(m)).to_frame('cm_x')
print (df1)
            cm_x
0    -214.921628
1    -214.951023
2    -214.968638
3    -215.201292
4    -215.214800
7441 -245.078910
7442 -244.943961
7443 -244.806606
7444 -244.665285
7445 -244.533503

推荐阅读