在数据帧中按行质量中心,每列乘以不同质量

问题描述 投票:1回答:2

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

这些对象在数据框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   ...

有帮助吗?

python pandas apply mass
2个回答
1
投票

如果我理解正确,您可以像这样计算所需的列:

>>> df.mul(m).sum(axis=1)/sum(m)
0   -214.921628
1   -214.951023
2   -214.968638
3   -215.201292
4   -215.214800

1
投票

使用DataFrame.dot并除以列表DataFrame.dotsum

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
© www.soinside.com 2019 - 2024. All rights reserved.