假设我有一个像这样的数据框
Placement Value Order
0 high 10 1
1 med 5 2
2 high 9 3
3 low 3 4
4 med 7 5
5 low 2 6
6 med 6 7
7 high 9 8
8 med 4 9
9 low 2 10
10 high 8 11
11 med 6 12
12 high 8 13
13 med 5 14
14 low 1 15
当遇到“高 -> 低”、“低 -> 高”、“高 -> 中 -> 低”或“低 -> 中 -> 高”的“放置”序列时,我想找到序列的“高”和“低”之间的值差,将其作为值添加到序列最后一行的新“Diff”列中。另外,我想要另一列“测量自”,它从序列中的第一行获取“顺序”值。然后,我会删除所有没有新列值的行,从而产生像
这样的数据框 Placement Value Order Diff Measured From
3 low 3 4 -6 3
7 high 9 8 7 6
9 low 2 10 -7 8
10 high 8 11 6 10
14 low 1 15 -7 13
我想出了一种方法,通过查看每行的前两个“放置”值来实现这一点,但我读到使用 Pandas 时应该避免迭代。有没有更有效的方法来找到这些模式并进行计算?
代码
cond = df['Placement'].ne('med')
tmp = df[cond]
cond1 = tmp['Placement'].eq('high')
cond2 = tmp['Placement'].shift().eq('low')
tmp1 = tmp.assign(Diff=tmp['Value'].diff(), Measured_From=tmp['Order'].shift())[cond1 & cond2]
cond3 = tmp['Placement'].eq('low')
cond4 = tmp['Placement'].shift().eq('high')
tmp2 = tmp.assign(Diff=tmp['Value'].diff(), Measured_From=tmp['Order'].shift())[cond3 & cond4]
out = pd.concat([tmp1, tmp2]).sort_index().astype({'Measured_From': 'int'})
出
Placement Value Order Diff Measured_From
3 low 3 4 -6.0 3
7 high 9 8 7.0 6
9 low 2 10 -7.0 8
10 high 8 11 6.0 10
14 low 1 15 -7.0 13