【问题标题】:How do I update the values in a pandas dataframe column until first occurance of a value in the same column?如何更新熊猫数据框列中的值,直到同一列中第一次出现值?
【发布时间】:2018-01-26 17:26:58
【问题描述】:

我有以下数据框 -

              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

我想修改此数据框,以将“Regime”列值设置为 0,直到第一次出现“-1”。之后,我想保持数据框不变。我将如何实现这一目标?

TIA

【问题讨论】:

    标签: python-2.7 pandas numpy


    【解决方案1】:

    使用idxmax作为第一个-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
    

    还有piRSquared 的另一个解决方案,谢谢:

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

    【讨论】:

    • 没问题,只将()print (df)删除到print df
    • 哎呀,对不起。我忘记了日期时间索引。答案已编辑。
    • 行得通!如果您不介意为什么必须以不同的方式处理日期时间索引?
    • 抱歉,出现了一点错误。对于像 datetimeindex 这样的按值选择,必须使用loc,对于按位置选择iloc。这是必要的按位置选择,因为df.loc[:df['Regime'].eq(-1).idxmax() , 'Regime'] = 0 删除最后一个-1 并替换为0
    【解决方案2】:

    选项1
    np.logical_and.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
    

    【讨论】:

      猜你喜欢
      • 2019-11-19
      • 1970-01-01
      • 2020-09-12
      • 2017-02-20
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      相关资源
      最近更新 更多