【问题标题】:Updating a pandas column to replace values with np.nan if the value occurs once, and then reset once another value occus如果值出现一次,则更新 pandas 列以用 np.nan 替换值,然后在另一个值出现时重置
【发布时间】:2019-05-10 18:16:12
【问题描述】:

标题很混乱,所以让我解释一下。我有一个熊猫专栏:

x   | desired x
1.5 | 1
1   | 1
1   | 1         
1   | 1
1   | 1
0   | 0
0   | 0
0   | 0
0   | 0
1   | 0
0   | 0
-1.5|-1
-1  |-1
-1  |-1
-1  |-1
0   | 0  
0   | 0
0   | 0
0   | 0
-1  | 0
0   | 0
0   | 0
1.5 | 1

...

目前,我已经使用 itertuples 解决了这个问题:

 currval = np.nan
for idx in df.itertuples():
    if idx[33] == 1.5: 
        currval = 1
    elif idx[33] == -1.5:
        currval = -1
    elif idx[32] <> "":
        currval = np.nan
    else: 
        next
    df.loc[idx.Index,'refPos2'] = currval

但是,这段代码太慢了,想知道是否有人对如何向量化它有想法。

谢谢!

【问题讨论】:

  • 它们只是我正在使用的数据框中的列。 Idx 是行迭代。如果有帮助,32 是一个名为 exit 的指标列,33 是一个名为 'refPos' 的指标列
  • 不,只是传递给下一次迭代
  • 它会起作用,但不会达到您的预期。我认为您需要使用 pass 而不是 next。 next 是一个内置函数
  • 我已经删除了以前的 cmets,这些都太大了。 &lt;&gt; 已被弃用很长时间,next 没有做你想做的事,你的问题也不清楚。它看起来很容易矢量化,但你真的应该花更多的精力来解释你在做什么。

标签: python pandas python-2.x


【解决方案1】:

我从cmets那里了解到的问题陈述,这里是解决方案:

for index, item in enumerate(a): ## a is your list [-1.5,1,1,0,1,1.5]
    if item == 1.5:
       a[index] = 1
    elif item == -1.5:
       a[index] = -1
    elif a[index] == 0:
        a[index] = 0
    elif a[index] == 1 and a[index-1] ==0:
        a[index] = 0
    else:
        a[index] =1

【讨论】:

  • 关闭,不完全正确,但这是我解释不好的错;此外,我需要一个矢量化解决方案或一个解决方案而不是 for 循环。
  • 第三个 elif 是:“elif (a[index] == 1 or a[index] == -1) and a[index-1] == 0:”,最后一个else 将是 -1 或 1,具体取决于先前的值是分别是 -1 还是 1
  • 是的!我错过了-1 部分!!我的建议是“提出一个新问题,建议这可以通过循环来完成”我的解决方案,现在如何对其进行矢量化。
  • 谢谢!我投了赞成票,但我的投票太新了,无法公开展示!
  • 没问题,如果您得到其他答案,那就太好了,否则请执行我的建议,即使您不能很好地解释您需要什么。人们会从我写的代码中理解......然后你可以接受我对这个解决方案的回答!
猜你喜欢
  • 2021-12-08
  • 1970-01-01
  • 2020-11-20
  • 2014-10-08
  • 2020-05-27
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多