2017-02-17 32 views
1

我有三列“A”,“B”和“C”一个DF从一个值和MULTIPLY中减去所有值。移动到下一个值和重复

[a] [b] [c] 
2 2 12 
11 5.95 12 
10 16.7 12 

我需要的是一个额外的列“d”,它代表下面的计算:

((2-11)* 5.95 +(2-10)* 16.7)/ 12 = -15.59583333

((11-2)* 2 +(11-10)* 16.7)/ 12 = 2.8916666667 ((10-11)* 5.95 +(10-2)* 2)/ 12 = 0.8375

[a] [b] [c] [d] 
2 2 12 -15.59583333 
11 5.95 12 2.8916666667 
10 16.7 12 0.8375 

它应该是高度动态的,所以行数可以不同。速度也是我为什么要避免循环的一个问题。

我试图使用.apply()和.pivot()以简单的格式调用sub()和mul(),但它没有解决。

回答

2

一种选择是apply通过一系列a并做计算的每个元素分开:

df['d'] = df.a.apply(lambda x: ((x - df.a) * df.b/df.c).sum()) 
df 

enter image description here


或者你可以预先计算df.b/df.c使这稍微更高效:

coef = df.b/df.c 
df['d'] = df.a.apply(lambda x: ((x - df.a) * coef).sum()) 
+0

我提供的最初输入是在一个groupby对象后面。所以,当我在组合对象上运行你的代码时,它返回的是'd'的NAN。 我尝试使用.transform,但这只给了我'0' – jumboRumbo

+0

然后可能'.groupby(...)。apply(lambda g:g.assign(d = gaapply(lambda x:((x-ga)* gb/gc).sum())'。不知道你的实际数据,我不能保证能解决你的问题 – Psidom

+0

你真是个天才! – jumboRumbo

相关问题