当列值满足特定序列时 Pandas Dataframe 上的条件语句

问题描述 投票:0回答:1

假设我有一个像这样的数据框

   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 时应该避免迭代。有没有更有效的方法来找到这些模式并进行计算?

python pandas numpy
1个回答
1
投票

代码

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
© www.soinside.com 2019 - 2024. All rights reserved.