2 回答
TA贡献1850条经验 获得超11个赞
只做一个mask满足所有三个条件的,然后对原始的进行子集化DataFrame
mask = (
(df.Result == 1)
| (df.Result.ffill() == 1)
| ((df.Result.ffill() == 0)
& (df.groupby((df.Result.ffill() != df.Result.ffill().shift()).cumsum()).Result.transform('size') <= 2))
)
输出: df[mask]
Timestamp Value Result
0 00-00-10 34567 1.0
1 00-00-20 45425 NaN
2 00-00-30 46773 0.0
3 00-00-40 64567 NaN
4 00-00-50 25665 1.0
5 00-01-00 25678 NaN
6 00-01-10 84358 NaN
11 00-02-00 85957 1.0
12 00-02-10 58840 NaN
说明:你有三个条件
如果结果 == 1 则保留
如果它是低于 Result == 1 的 Nan 则保留(已完成
.ffill()
)第三个条件决定了连续组的大小,如果是连续组的
0
大小,我们保留<= 2
TA贡献1801条经验 获得超8个赞
示例数据:
df = pd.DataFrame({'Timestamp': ['00-00-10', '00-00-20', '00-00-30', '00-00-40',
'00-00-50', '00-01-00', '00-01-10', '00-01-20',
'00-01-30', '00-01-40', '00-01-50', '00-02-00',
'00-02-10'],
'Value': range(0, 13),
'Result': [1.0, None, 0.0, None, 1.0, None, None, 0.0, None, None, None, 1.0, None]})
代码:
#where NaN after 1
df1 = df.shift(-1)[df.Result == 1]
#where 1
df2 = df[df.Result==1]
#index where 0 with max Timestamp
ind = df[df.Timestamp == min(df[df.Result == 0].Timestamp)[df.Result==0].index[0]
#select by ind and one next
df3 = df.loc[[ind, ind+1]]
输出:
Result Timestamp Value
0 NaN 00-00-20 1.0
4 NaN 00-01-00 5.0
11 NaN 00-02-10 12.0
0 1.0 00-00-10 0.0
4 1.0 00-00-50 4.0
11 1.0 00-02-00 11.0
2 0.0 00-00-30 2.0
3 NaN 00-00-40 3.0
然后,您可以根据需要按索引排序。我希望它有帮助。但我不确定我是否了解您对上次选择的了解。我不明白为什么你的结果是“00-01-10”。
添加回答
举报