如果前面不存在另一个条件,如何获得满足掩码条件的第一行?

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

这是我的数据框:

import pandas as pd

df = pd.DataFrame(
    {
        'close': [109, 109, 105, 110, 105, 120, 120, 11, 90, 100],
        'high': [110, 110, 108, 108, 115, 122, 123, 1120, 1000, 300],
        'target': [107, 107, 107, 107, 107, 124, 124, 500, 500, 500]
    }
)

口罩是:

m1 = (
    (df.high > df.target) &
    (df.close > df.target)
)

m2 = (
    (df.high > df.target) &
    (df.close < df.target)
)

预期输出将行

7
作为输出:

  close  high  target
7     11  1120  500

流程是:

a)

target
列进行分组。

b) 对于每个组,我想找到满足

m2
条件的第一行,如果
m1
在它之前没有任何匹配项。

例如:

对于第 107 组,有

m2
的匹配项,但由于
m1
在此之前有匹配项,因此应跳过该组。

对于下一组 124,没有与

m2
匹配的行。

对于组 500,有一行且其之前没有任何行,

m1
为 true。

对于每个组,我想要具有此条件的一行,对于总结果,我想要第一个匹配项。因此,例如,如果为多个组找到一行,则无论组如何,都应在

df
中选择第一行。

这些是我的尝试:

# attmpt 1
df['a'] = m1.cummax()
df['b'] = m2.cummax()
# attempt 2
out = df[m2.cumsum().eq(1) & m2]
python pandas dataframe
1个回答
1
投票

IIUC,您可以使用

groupby.cummin
:

构建反向掩模
out = df[(~m1).groupby(df['target']).cummin() & m2].drop_duplicates('target')

输出:

   close  high  target
7     11  1120     500

中间体:

   close  high  target    ~m1  cummin  ... & m2
0    109   110     107  False   False     False
1    109   110     107  False   False     False
2    105   108     107   True   False     False
3    110   108     107  False   False     False
4    105   115     107   True   False     False
5    120   122     124   True    True     False
6    120   123     124   True    True     False
7     11  1120     500   True    True      True
8     90  1000     500   True    True      True
9    100   300     500   True    True     False
© www.soinside.com 2019 - 2024. All rights reserved.