数据框操作 - 捕获值的变化

时间:2017-08-21 14:51:18

标签: python pandas

我目前有一个如下数据框,显示位置变化,加1个单位,减去1个单位或什么也不做(0)。

enter image description here

我希望创建第二个具有净位置的数据帧,该位置为长(1)或平(0) - 假设无法实现净短(-1)位置。

所以逻辑是从0开始,当第一个+1'位置改变时切换到1。发生(忽略任何后续+1),然后只有在看到-1时才切换回0。

有关如何做到这一点的任何想法?我们的想法是按照以下

创建df2

enter image description here

如果每个+1'位置发生变化,

df.cumsum()都会有效。我只想数数,但我只希望捕获“长或平”的信息。不是任何累积多头头寸的大小。

输入数据框:

enter image description here

输出数据框:

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个矢量化解决方案:

df['CiP'].where(df['CiP'].replace(to_replace=0, method='ffill').diff(), 0).cumsum()

说明:

  • replace的调用会将0值替换为前一个非零值。
  • diff的调用会指向实际的位置变化。
  • where的调用可确保真正更改的值被0替换。
  • 经过这种治疗后,cumsum才有效。

修改:如果您有多列,请按上述定义一项功能并应用它。

def position(series):
    return series.where(series.replace(to_replace=0, method='ffill').diff(), 0).cumsum()

df[list_of_columns].apply(position)

这可能比显式循环列更快。