同时写两个对象

时间:2015-06-03 10:27:42

标签: python pandas

我需要同时计算两个相互依赖的值。问题是ab取决于ab的先前值。所以我们需要同时计算它们,同时参考循环的最后计算值。到目前为止我所拥有的是:

   x = df.x # just a list containing randomly 1 and 0
   df['a']=100 # 100 is just the starting value for a and b and shall be then overwritten by the while loop
   df['b']=100
   i=1    
   while i<len(df.index):
       df.a[i] = x*((df.a.shift(1)*0.45)+(df.b.shift(1)*0.5))+abs(1-x)*df.a.shift(1)
       df.b[i] = x*((df.b.shift(1)*0.5)+(df.a.shift(1)*0.59))+abs(1-x)*df.b.shift(1)
       i+1

df是一个DataFrame。 目前我收到错误:ValueError: setting an array element with a sequence.

我也知道为什么我会遇到这个问题,请参阅this question。问题是,我该如何解决这个问题?可能有一个比while循环更有效的解决方案...

2 个答案:

答案 0 :(得分:1)

我注意到df.adf.b都是序列。因此,您可以使用map来获取结果。

示例:

l = [1, 2, 3]
set_negative = lambda x: x * -1  # Some function o lammbda that receives a sinble argument
ml = map(set_negative, l) # ml = [-1, -2, -3]

在您的情况下,您可以像这样编写代码:

in_a = lambda _: x*((df.a.shift(1)*0.45)+(df.b.shift(1)*0.5))+abs(1-x)*df.a.shift(1)
in_b = lambda _: x*((df.b.shift(1)*0.5)+(df.a.shift(1)*0.59))+abs(1-x)*df.b.shift(1)

df.a = map(in_a, df.a)
df.b = map(in_b, df.b)

您可以使用starmapimap

尝试更多的软化解决方案

答案 1 :(得分:0)

基本上首先你说df['a']是一个int,之后你想迭代df.a,好像它是一个数组。因此,如果您将df['a']=100更改为df['a'][0] = 100,则应该有效。