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