如果 Pandas 中较小,如何将当前行项目设置为上一个?
How to set current row item to previous if smaller, in Pandas?
假设我有以下 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
的当前元素小于或等于,则将其设置为前一个元素,如果元素已更改为,则添加一个布尔值以前的。但是,我不知道该怎么做。生成的 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
您可以使用 cummax()
来计算列的累积最大值。
将cummax()
的结果存为临时变量,与原来的列进行比较得到"Altered"列,然后赋值给新的"Value"列:
temp = df.Value.cummax()
df['Altered'] = df.Value < temp
df['Value'] = temp
这给出:
>>> df
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 False
5 2015-06-30 1 2.0 True
6 2015-07-31 1 3.0 False
7 2015-08-31 1 3.0 True
(请注意 "Altered" 中索引 4 处的值是 False,而不是 True,因为该值仍然是 2.0
。)
假设我有以下 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
的当前元素小于或等于,则将其设置为前一个元素,如果元素已更改为,则添加一个布尔值以前的。但是,我不知道该怎么做。生成的 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
您可以使用 cummax()
来计算列的累积最大值。
将cummax()
的结果存为临时变量,与原来的列进行比较得到"Altered"列,然后赋值给新的"Value"列:
temp = df.Value.cummax()
df['Altered'] = df.Value < temp
df['Value'] = temp
这给出:
>>> df
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 False
5 2015-06-30 1 2.0 True
6 2015-07-31 1 3.0 False
7 2015-08-31 1 3.0 True
(请注意 "Altered" 中索引 4 处的值是 False,而不是 True,因为该值仍然是 2.0
。)