【问题标题】:Calculate center of mass row-wise in a pandas data frame在熊猫数据框中按行计算质心
【发布时间】:2018-01-22 01:43:11
【问题描述】:

我想逐行计算 pandas 数据框的质心 (cm)(大约 4000 行 x 7100 列)。我的行的索引是字符串类型,值只是数字。所以基本上我的数据框是这样的——只是更大:

import pandas as pd
inp = [{'name':'aaa', 'c2':100, 'c3': 20, 'c4':10}, {'name':'bbb','c2':110, 'c3': 20, 'c4':10}, {'name':'ccc','c2':120, 'c3': 20, 'c4':10}]
df = pd.DataFrame(inp)
df = df.set_index('name')

       c2  c3  c4
name             
aaa   100  20  10
bbb   110  20  10
ccc   120  20  10

在 R 中我会使用这个(我的矩阵称为 m 并且与上面的数据框具有相同的结构):

cm <- apply( m, 1, function(x) sum( x*(1:length(x)) ) / sum(x) ) 

编写一个计算 cm 的函数然后将其逐行应用于我的数据框应该相当容易,但不知何故我不明白这一点。我的 Python 技能非常有限。我还不明白我基本上如何遍历行的元素来获取 cm 的语法。

【问题讨论】:

  • 当我的 - 在这种情况下 - 矩阵被称为 m ...不清楚m 在这里是什么?
  • m 在 R 中将是我的矩阵的名称,它看起来基本上像我上面发布的数据框,抱歉不清楚。我现在试图在帖子中说得更清楚。
  • 在这种情况下,我建议pandas 是错误的选择...查看numpy 处理您的数据

标签: python apply


【解决方案1】:

你可以使用pandas的@​​987654321@方法

import pandas as pd
inp = [{'name':'aaa', 'c2':100, 'c3': 20, 'c4':10}, {'name':'bbb','c2':110, 'c3': 20, 'c4':10}, {'name':'ccc','c2':120, 'c3': 20, 'c4':10}]
df = pd.DataFrame(inp)
df = df.set_index('name')

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))

df.apply(series_sum, axis=1)

【讨论】:

  • 这看起来已经非常像我要找的了。但是,如果我运行它,我只会为所有行得到 1(它是整数类型,尽管人们会期望浮点数)。我做错了什么?
  • 所以我现在检查了分母 (np.sum(np.inner(pd_series.values, np.asarray(range(1, len(pd_series)+1))))) 和分母 (np.sum(pd_series)),它们给出的正是我所期望的,所以我发现除法本身导致了我的问题。如果我在除法之前将提名者和分母转换为浮点数,我会得到想要的结果。非常感谢!
猜你喜欢
  • 2018-09-04
  • 2017-12-29
  • 2015-01-28
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多