我有一个pandas数据框,其值应大于或等于先前的值。如果当前值小于先前值,则必须将先前值设置为等于当前值。最好通过以下示例对此进行解释:
data = {'group':['A', 'A', 'A', 'A', 'A', 'B', 'B',
'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'value':[0, 1, 2, 3, 2, 0, 1, 2, 3, 1, 5, 0, 1, 0, 3, 2]}
df = pd.DataFrame(data)
df
group value
0 A 0
1 A 1
2 A 2
3 A 3
4 A 2
5 B 0
6 B 1
7 B 2
8 B 3
9 B 1
10 B 5
11 C 0
12 C 1
13 C 0
14 C 3
15 C 2
我正在寻找的结果是:
group value
0 A 0
1 A 1
2 A 2
3 A 2
4 A 2
5 B 0
6 B 1
7 B 1
8 B 1
9 B 1
10 B 5
11 C 0
12 C 0
13 C 0
14 C 2
15 C 2
答案 0 :(得分:1)
这就是我的去! (特别感谢@jezrael帮助我大大简化了它!)
相反,我将其基于Expanding Windows
,以便始终获得每个组中元素的后缀(从最后一个元素扩展到第一个元素)。
此扩展窗口具有以下逻辑:
对于索引i
中的元素,您将得到一个Series
,其中包含索引为>=i
的组中的所有元素,并且我需要在结果中返回i
的新单个值。
该后缀对应的值是多少?最低!因为如果后面的元素较小,我们需要选择其中最小的元素。
然后我们可以将该操作的结果分配给df['value']
。
尝试一下:
df['value'] = (df.iloc[::-1]
.groupby('group')['value']
.expanding()
.min()
.reset_index(level=0, drop=True)
.astype(int))
print (df)
输出:
group value
0 A 0
1 A 1
2 A 2
3 A 2
4 A 2
5 B 0
6 B 1
7 B 1
8 B 1
9 B 1
10 B 5
11 C 0
12 C 0
13 C 0
14 C 2
15 C 2
答案 1 :(得分:0)
我没有得到您的输出,但是我相信您正在寻找类似的东西
df['fwd'] = df.value.shift(-1)
df['new'] = np.where(df['value'] > df['fwd'], df['fwd'], df['value'])