【问题标题】:Writing two objects simultaneously同时写入两个对象
【发布时间】:2015-06-03 10:27:41
【问题描述】:

我需要同时计算两个相互依赖的值。问题是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 是一个数据帧。 目前我收到错误:ValueError: setting an array element with a sequence.

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

【问题讨论】:

  • 在 Python 中你可以做例如a, b = some_op(a, b), other_op(a, b) 使用右侧的旧值并在左侧分配两个新值。
  • 解决这个 2 变量问题的一个常见方法是使用一个临时变量来存储 a 的“旧”值。所以像old_a = a; a = get_new_a(a, b); b = get_new_b(old_a, b).
  • 我将如何实施这样的解决方案?
  • 您报告的错误与您提出的问题无关。尝试将问题分开,以便您可以理解答案(以及我们的问题)。

标签: python pandas


【解决方案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

【讨论】:

  • 什么是“l = [1, 2, 3]”和“ml = map(set_negative, l) # ml = [-1, -2, -3]”?
  • 仅用于说明 map 函数的使用:l 是一个包含整数值 1、2 和 3 的列表,ml 是我们通过应用 @ 得到的列表987654330@ lambda 到l。换句话说,我们对序列l 的每个元素都应用了一个函数,而没有使用for o while 循环。
【解决方案2】:

首先你说df['a'] 是一个int,然后你想迭代df.a,就好像它是一个数组一样。因此,如果您将 df['a']=100 更改为 df['a'][0] = 100 它应该可以工作。

【讨论】:

  • 我不是用 df['a']= [100] 定义 df.a 的长度吗? - 它返回:ValueError:值的长度与索引的长度不匹配
  • 它返回:KeyError: 'a',关键是df['a'] = 100就可以了。它创建一个填充 100 的数据框列,然后在运行中覆盖(重要的是从 100 开始)。问题是在下面的行中产生错误,因为我尝试在那里将一系列传递给单行。 - 但这只是我目前的理解......
  • 我想我误解了,因为我没有你的 df 我无法检查你的作业最终看起来像什么值,你能打印你的 x*((df.a.shift(1)*0.5..... 看看打印什么样的结果?
  • df.a 仅填充 100s - 即 df['a']=100
  • 所以你的变量赋值的结果总是100?我的意思是,如果你喜欢:test = x*((df.a.shift(1)*0.5...... ; print(test) 打印的是什么?
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多