这是我的数据框:
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]
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