Python 2.7 如何更新dataframe列中的值,直到同一列中的值首次出现?

Python 2.7 如何更新dataframe列中的值,直到同一列中的值首次出现?,python-2.7,pandas,numpy,Python 2.7,Pandas,Numpy,我有以下数据帧- 50d-200d Regime Date 2017-02-22 NaN 0 2017-02-23 NaN 0 2017-02-24 NaN 0 2017-02-27 0.52 1 2017-02-28 0.92 1 ... 2017-04-04 0.

我有以下数据帧-

              50d-200d  Regime  
Date                          
2017-02-22       NaN       0  
2017-02-23       NaN       0  
2017-02-24       NaN       0  
2017-02-27      0.52       1  
2017-02-28      0.92       1  
...
2017-04-04      0.39       1  
2017-04-05      0.16       1  
2017-04-06     -0.08      -1  
2017-04-07     -0.30      -1  
2017-04-10     -0.51      -1
...
2017-08-09     -1.15      -1  
2017-08-10     -0.52      -1  
2017-08-11      0.07       1  
2017-08-17      2.67       1
我想修改此数据帧,以便在第一次出现“-1”之前将“区域”列值设置为0。在那之后,我想保持数据帧不变。我将如何实现这一点

TIA

用于第一个
-1
的索引值,然后设置
0

idx = df['Regime'].eq(-1).idxmax()
df.iloc[:df.index.get_loc(idx), df.columns.get_loc('Regime')] = 0
print (df)
            50d-200d  Regime
Date                        
2017-02-22       NaN       0
2017-02-23       NaN       0
2017-02-24       NaN       0
2017-02-27      0.52       0
2017-02-28      0.92       0
2017-04-04      0.39       0
2017-04-05      0.16       0
2017-04-06     -0.08      -1
2017-04-07     -0.30      -1
2017-04-10     -0.51      -1
2017-08-09     -1.15      -1
2017-08-10     -0.52      -1
2017-08-11      0.07       1
2017-08-17      2.67       1
还有另一个解决方案,谢谢:

df.iloc[:df.Regime.eq(-1).values.argmax(), df.columns.get_loc('Regime')] = 0

选项1
np.logical\u和.accumulate

df.assign(Regime=df.Regime.mask(np.logical_and.accumulate(df.Regime.ne(-1)), 0))

            50d-200d  Regime
Date                        
2017-02-22       NaN       0
2017-02-23       NaN       0
2017-02-24       NaN       0
2017-02-27      0.52       0
2017-02-28      0.92       0
2017-04-04      0.39       0
2017-04-05      0.16       0
2017-04-06     -0.08      -1
2017-04-07     -0.30      -1
2017-04-10     -0.51      -1
2017-08-09     -1.15      -1
2017-08-10     -0.52      -1
2017-08-11      0.07       1
2017-08-17      2.67       1
选项2

df.assign(Regime=df.Regime.mask(df.Regime.ne(-1).cumprod().astype(bool), 0))

            50d-200d  Regime
Date                        
2017-02-22       NaN       0
2017-02-23       NaN       0
2017-02-24       NaN       0
2017-02-27      0.52       0
2017-02-28      0.92       0
2017-04-04      0.39       0
2017-04-05      0.16       0
2017-04-06     -0.08      -1
2017-04-07     -0.30      -1
2017-04-10     -0.51      -1
2017-08-09     -1.15      -1
2017-08-10     -0.52      -1
2017-08-11      0.07       1
2017-08-17      2.67       1

没问题,只需将
()
print(df)
删除到
print df
oops,对不起。我忘了日期时间索引。答案是经过编辑的,很有效!如果您不介意为什么必须以不同的方式处理datetime索引的话?对不起,有一点错误。对于像datetimeindex这样的按值选择,必须使用
loc
,对于按位置选择
iloc
。这里有必要按位置选择,因为
df.loc[:df['Regime'].eq(-1).idxmax(),'Regime']=0
删除最后一个
-1
并替换为
0