2015-01-13 16 views
1

我想根据列A和B的先前数据计算列B.一个简单的函数示例是Python Pandas:如何使一个列行依赖于它的前一行,可能带有一个函数?

例如, B(N)= A(N-1)+ B(N-1)

其中Ñ是熊猫数据帧的索引。我不一定需要使用数据帧索引。

在这个例子中,我从B(1)= 0开始,并以连续的方式添加A行。

n A(n) B(n) 
---------------- 
1  1  0 
2  0  1 
3  2  1 
4  9  3 

这个数据结构的一个例子就是在熊猫被定义为

d = {'A' : pd.Series([1, 0, 2, 9],), 
    'B' : pd.Series([0, float("nan"), float("nan"), float("nan")])} 

df = pd.DataFrame(d) 

更新

两个亨利Cutchers'和雅各布的回答工作做好。

+0

是的,那是因为它太晚了,当我发布 - 修复现在... :-) –

+0

是的,修复它。谢谢! – rtoip

回答

1

作为你的例子的问题可以减少依赖于B [0]A [n]的只: enter image description here
可能的简单的解决方案可能看起来像

import pandas as pd 
import numpy as np 
d = {'A' : pd.Series([1, 0, 2, 9],), 
    'B' : pd.Series([0, float("nan"), float("nan"), float("nan")])} 

df = pd.DataFrame(d) 
for i in range(1,len(df.A)): 
    df.B[i] = df.B[0] + np.sum(df.A[:i]) 
df 

这导致在数据框中
enter image description here

如果您面临类似的迭代依赖关系,您应该能够解析ct类似的方法适合您的需求。

0

您是否想过使用Cython http://www.cython.org?它将与熊猫进行互操作 - 相同的数据结构等(因为熊猫是用cython编写的)。在我看来,您需要以任意方式遍历数据帧的能力(不了解更多关于您的问题的信息,这就是我所能说的),但仍需要速度。用Cython编译为C.

我可以预见形式的循环:

import numpy 
import pandas 
import datetime 
dates = pandas.date_range('20130101',periods=6) 
myDataFrame = pandas.DataFrame(numpy.arange(12).reshape((6,2)),index=dates,columns=list('ab')) 
a=myDataFrame["a"] 
b=myDataFrame["b"] 
print a 
print b 
out=numpy.empty_like(a.values) 
out[0] = 0 
#this loop will work but be slow... 
for i in range(1, a.shape[0]): 
    out[i] = a[i-1] + b[i-1] 
myDataFrame['c'] = pandas.Series(out, index=myDataFrame.index) 
print myDataFrame 

但是,这将是缓慢的。

+0

你好亨利,的确,它是你提到我想使用的迭代方式的自由。目前,表演对我来说是次要的。到目前为止,我还不清楚我应该如何在Python/Pandas中完成这项工作。 – rtoip

+0

增强了我的答案。 –

+0

在* out = np.empty(shape =(a.shape [0],),dtype = np.float32))*中有* SyntaxError:invalid syntax *。现在,我得到一个阵列**出**,看起来像这样: 输出[13]: * array([nan,1.,nan,nan],dtype = float32 * – rtoip

相关问题