2017-02-14 55 views
3

我有两列“A”和“B”一个DF大熊猫从一个值减去所有值,移动到下一个值和重复

[a] [b] 
11 100 
2 100 
10 100 

我需要的是一个额外的列“C”,这表示以下计算:

((11-2)+(11-10))/ 100

((2-11)+(2-10))/ 100

((10- 11)+(10-2))/ 100

[a] [b] [c] 
11 100 0.1 
2 100 -0.17 
10 100 0.07 

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

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

回答

2

另一种解决方案重写大熊猫:

使用mulsubdivsum,为DataFrame最快lengthlen(df.index)

df['c'] = df.a.mul(len(df.index)).sub(df.a.sum()).div(df.b) 
print (df) 
    a b  c 
0 11 100 0.10 
1 2 100 -0.17 
2 10 100 0.07 

它的工作原理,这是因为:

((11-2) + (11-10)) 

是一样的:

(2 * 11) - (2 + 10) 

和相同:

(3 * 11) - (2 + 10 + 11) 
2

我给一个numpy的例子。对于

>>> a = numpy.array([11, 2, 10]) 
>>> b = numpy.array([100, 100, 100]) 

你可以做

>>> c = (len(a) * a - sum(a))/b 

的熊猫数据帧相似。

+0

@ Michael2016 - 没问题,这是确定。 – jezrael