首页 > 解决方案 > python/pandas 在给定条件的情况下将值写入前一行

问题描述

给定具有日期时间索引的数据框:

df = 

                  FB       GOOGL      HD     JNJ       KO      MCD   MSFT  
Date                                                                        
2007-02-23    0.0000   235.49821   40.98   64.16  23.6350   46.050  28.90   
2007-03-02    0.0000   219.55276   38.98   61.84  22.9250   43.630  27.76   
2007-03-09    0.0000   226.65464   38.65   62.14  23.7850   44.160  27.29   
2007-03-16    0.0000   220.37356   37.50   60.51  23.5900   43.460  27.31   
2007-03-23    0.0000   231.12898   38.23   60.50  24.0300   45.050  27.99   
2007-03-30    0.0000   229.16207   36.74   60.25  24.0000   45.030  27.87   
2007-04-06    0.0000   235.97868   38.02   61.56  24.7550   45.770  28.55   
2007-04-13    0.0000   233.37616   37.89   62.35  24.9450   47.680  28.62   
2007-04-20    0.0000   241.47901   39.24   65.08  26.0650   48.350  29.02   
2007-04-27    0.0000   239.73732   38.46   64.16  26.0350   48.960  30.13   
2007-05-04    0.0000   235.78349   38.92   64.47  26.6250   49.920  30.56   
2007-05-11    0.0000   233.60138   38.91   62.26  26.3600   50.700  30.90   
2007-05-18    0.0000   235.37309   38.87   63.42  26.3050   52.330  30.83   
2007-05-25    0.0000   241.88941   38.37   63.23  25.9450   50.860  30.48   
2007-06-01    15.000   250.46772   39.22   63.38  26.3900   50.910  30.60   
2007-06-08    20.000   257.94997   37.94   62.13  25.8300   51.380  30.05   
2007-06-15    25.000   253.19536   38.00   62.76  25.7900   52.190  30.49   
2007-06-22    30.000   262.69957   39.53   61.11  25.8250   50.420  29.50   
2007-06-29    35.000   261.93383   39.35   61.62  26.1500   50.760  29.47   

我有一个需要进行公式计算的日期列表。但是,由于某些特定错误,当股票恰好在日期进入数据框/市场(0 表示股票此时没有价值)时,我的代码会中断。

假设我需要进行计算的日期列表是

myList = ["2007-06-01"]

我想要一个更新的数据框,如果索引的myList日期与日期匹配,并且列的所述日期之前的值为 0,则将该 0 设置为下一列的值,如下所示。

dfUpdated = 

                  FB       GOOGL      HD     JNJ       KO      MCD   MSFT  
Date                                                                        
2007-02-23    0.0000   235.49821   40.98   64.16  23.6350   46.050  28.90   
2007-03-02    0.0000   219.55276   38.98   61.84  22.9250   43.630  27.76   
2007-03-09    0.0000   226.65464   38.65   62.14  23.7850   44.160  27.29   
2007-03-16    0.0000   220.37356   37.50   60.51  23.5900   43.460  27.31   
2007-03-23    0.0000   231.12898   38.23   60.50  24.0300   45.050  27.99   
2007-03-30    0.0000   229.16207   36.74   60.25  24.0000   45.030  27.87   
2007-04-06    0.0000   235.97868   38.02   61.56  24.7550   45.770  28.55   
2007-04-13    0.0000   233.37616   37.89   62.35  24.9450   47.680  28.62   
2007-04-20    0.0000   241.47901   39.24   65.08  26.0650   48.350  29.02   
2007-04-27    0.0000   239.73732   38.46   64.16  26.0350   48.960  30.13   
2007-05-04    0.0000   235.78349   38.92   64.47  26.6250   49.920  30.56   
2007-05-11    0.0000   233.60138   38.91   62.26  26.3600   50.700  30.90   
2007-05-18    0.0000   235.37309   38.87   63.42  26.3050   52.330  30.83   
2007-05-25    15.000   241.88941   38.37   63.23  25.9450   50.860  30.48   
2007-06-01    15.000   250.46772   39.22   63.38  26.3900   50.910  30.60   
2007-06-08    20.000   257.94997   37.94   62.13  25.8300   51.380  30.05   
2007-06-15    25.000   253.19536   38.00   62.76  25.7900   52.190  30.49   
2007-06-22    30.000   262.69957   39.53   61.11  25.8250   50.420  29.50   
2007-06-29    35.000   261.93383   39.35   61.62  26.1500   50.760  29.47

因此,由于这两个条件,基本上 2007-05-25 FB 库存从 0.000 变为 15.000。

标签: python-3.xpandasdataframe

解决方案


使用get_loc

df.iloc[df.index.get_loc("2007-06-01")-1,0]=df.iloc[df.index.get_loc("2007-06-01"),0]
df
Out[531]: 
              FB      GOOGL     HD    JNJ      KO    MCD   MSFT
Date                                                           
2007-02-23   0.0  235.49821  40.98  64.16  23.635  46.05  28.90
2007-03-02   0.0  219.55276  38.98  61.84  22.925  43.63  27.76
2007-03-09   0.0  226.65464  38.65  62.14  23.785  44.16  27.29
2007-03-16   0.0  220.37356  37.50  60.51  23.590  43.46  27.31
2007-03-23   0.0  231.12898  38.23  60.50  24.030  45.05  27.99
2007-03-30   0.0  229.16207  36.74  60.25  24.000  45.03  27.87
2007-04-06   0.0  235.97868  38.02  61.56  24.755  45.77  28.55
2007-04-13   0.0  233.37616  37.89  62.35  24.945  47.68  28.62
2007-04-20   0.0  241.47901  39.24  65.08  26.065  48.35  29.02
2007-04-27   0.0  239.73732  38.46  64.16  26.035  48.96  30.13
2007-05-04   0.0  235.78349  38.92  64.47  26.625  49.92  30.56
2007-05-11   0.0  233.60138  38.91  62.26  26.360  50.70  30.90
2007-05-18   0.0  235.37309  38.87  63.42  26.305  52.33  30.83
2007-05-25  15.0  241.88941  38.37  63.23  25.945  50.86  30.48
2007-06-01  15.0  250.46772  39.22  63.38  26.390  50.91  30.60
2007-06-08  20.0  257.94997  37.94  62.13  25.830  51.38  30.05
2007-06-15  25.0  253.19536  38.00  62.76  25.790  52.19  30.49
2007-06-22  30.0  262.69957  39.53  61.11  25.825  50.42  29.50
2007-06-29  35.0  261.93383  39.35  61.62  26.150  50.76  29.47

推荐阅读