Python 如何将当前行项目设置为前一行(如果较小),以熊猫为单位?

Python 如何将当前行项目设置为前一行(如果较小),以熊猫为单位?,python,pandas,dataframe,comparison,Python,Pandas,Dataframe,Comparison,假设我有以下数据帧: 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, 3

假设我有以下数据帧:

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,如果值的当前元素较小或相等,则将其设置为previous,如果元素已更改为previous,则添加一个布尔值。然而,我不知道该怎么做。生成的数据帧将是:

        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获取最新的最大值。将其与“值”列进行比较,以查看是否已更改

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
使用.cummax获取最新的最大值。将其与“值”列进行比较,以查看是否已更改

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
可以使用计算列的累积最大值

将cummax的结果存储为临时变量,将其与原始列进行比较以获得更改的列,然后将其指定为新值列:

temp = df.Value.cummax()
df['Altered'] = df.Value < temp
df['Value'] = temp
请注意,由于值保持为2.0,因此Altered中索引4处的值为False,而非True。

您可以使用该值计算列的累积最大值

将cummax的结果存储为临时变量,将其与原始列进行比较以获得更改的列,然后将其指定为新值列:

temp = df.Value.cummax()
df['Altered'] = df.Value < temp
df['Value'] = temp

请注意,更改后的索引4处的值为假,而不是真,因为该值仍然为2.0。

奇怪的问题,为什么第4行与预期结果不同?@deinonychusaur:索引4处的值在累积最大值列中仍然为2.0:未更改。也许这是OP的预期输出中的一个输入错误。我想在文本中定义“等于”和“OP express”一样经过修改,如果相关的话,会让它变得有点棘手。@deinonychusaur:如果是这样的话,我不清楚为什么索引0和1中也没有更改的值是假的。也许OP可以澄清…@Tingiskhan:没问题!让我知道这个答案是否缺少你想要的任何细节,我会添加进去。奇怪的问题,为什么第4行与预期结果不同?@deinonychusaur:索引4的值在累积最大值列中保持为2.0:它没有改变。也许这是OP的预期输出中的一个输入错误。我想在文本中定义“等于”和“OP express”一样经过修改,如果相关的话,会让它变得有点棘手。@deinonychusaur:如果是这样的话,我不清楚为什么索引0和1中也没有更改的值是假的。也许OP可以澄清…@Tingiskhan:没问题!如果这个答案遗漏了你想要的任何细节,请告诉我,我会把它添加进去。再次感谢建勋!再次感谢建勋!