Skip to main content
 首页 » 编程设计

python之在 Pandas 中,如果较小,如何将当前行项目设置为上一个

2025年05月04日35rubylouvre

假设我有以下 pandas DataFrame:

table = [[datetime.datetime(2015, 1, 31), 1, 0.5], 
         [datetime.datetime(2015, 2, 27), 1, 2], 
         [datetime.datetime(2015, 3, 31), 1, 1.5], 
         [datetime.datetime(2015, 4, 30), 1, 0],  
         [datetime.datetime(2015, 5, 31), 1, 2], 
         [datetime.datetime(2015, 6, 30), 1, 1.2], 
         [datetime.datetime(2015, 7, 31), 1, 3], 
         [datetime.datetime(2015, 8, 31), 1, 0]] 
 
df = pd.DataFrame(table, columns=['Date', 'Id', 'Value']) 
 
        Date  Id  Value 
0 2015-01-31   1    0.5 
1 2015-02-27   1    2.0 
2 2015-03-31   1    1.5 
3 2015-04-30   1    0.0 
4 2015-05-31   1    2.0 
5 2015-06-30   1    1.2 
6 2015-07-31   1    3.0 
7 2015-08-31   1    0.0 

我希望有一种简单的方法来遍历 df,如果 Value 的当前元素小于或等于,则将其设置为前一个元素,如果元素小于或等于,则添加一个 bool 值已经改成以前的了。但是,我不知道该怎么做。生成的 DataFrame 将是:

        Date  Id  Value  Altered 
0 2015-01-31   1    0.5  False 
1 2015-02-27   1    2.0  False  
2 2015-03-31   1    2.0  True 
3 2015-04-30   1    2.0  True 
4 2015-05-31   1    2.0  True 
5 2015-06-30   1    2.0  True  
6 2015-07-31   1    3.0  False 
7 2015-08-31   1    3.0  True 

请您参考如下方法:

使用 .cummax() 获取最新的最大值。将它与 Value 列进行比较,看看它是否已被更改。

import pandas as pd 
import datetime 
 
table = [[datetime.datetime(2015, 1, 31), 1, 0.5], 
     [datetime.datetime(2015, 2, 27), 1, 2], 
     [datetime.datetime(2015, 3, 31), 1, 1.5], 
     [datetime.datetime(2015, 4, 30), 1, 0],  
     [datetime.datetime(2015, 5, 31), 1, 2], 
     [datetime.datetime(2015, 6, 30), 1, 1.2], 
     [datetime.datetime(2015, 7, 31), 1, 3], 
     [datetime.datetime(2015, 8, 31), 1, 0]] 
 
df = pd.DataFrame(table, columns=['Date', 'Id', 'Value']) 
df['New_Value'] = df.Value.cummax() 
df['Altered'] = df['New_Value'] > df['Value'] 
 
print(df) 
 
 
        Date  Id  Value  New_Value Altered 
0 2015-01-31   1    0.5        0.5   False 
1 2015-02-27   1    2.0        2.0   False 
2 2015-03-31   1    1.5        2.0    True 
3 2015-04-30   1    0.0        2.0    True 
4 2015-05-31   1    2.0        2.0   False 
5 2015-06-30   1    1.2        2.0    True 
6 2015-07-31   1    3.0        3.0   False 
7 2015-08-31   1    0.0        3.0    True