在pandas数据框中逐行计算质量中心

时间:2017-08-14 08:53:52

标签: python apply

我想计算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。

1 个答案:

答案 0 :(得分:0)

您可以使用pandas的.apply方法

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)