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:没问题!如果这个答案遗漏了你想要的任何细节,请告诉我,我会把它添加进去。再次感谢建勋!再次感谢建勋!