我不确定如何最好地从基于列的布尔掩码创建基于行的布尔掩码。
我试图从一个“ SN”的“ B”中提取定义的长度(例如1,2,3等)正(或负)游程序列到一个新的掩码中。
我现在实现了一个简单的掩码(在下面),并在一个复杂的for循环的顶部加上了多个if语句来实现此目的。是否有一些更优雅的方法可以在Pandas中创建口罩?
df = pd.DataFrame({
"SN" : ["66", "66", "77", "77", "77", "77", "77"],
"B" : [-1, 1, 2, 3, 1, -1, 1]
})
mask = df['B'] > 0
带有简单掩码的输出是
SN B
0 66 -1
1 66 1
2 77 2
3 77 3
4 77 1
5 77 -1
6 77 1
0 False
1 True
2 True
3 True
4 True
5 False
6 True
所需的输出是
defined_min_length = 2
0 False
1 False
2 True
3 True
4 True
5 False
6 False
defined_min_length = 3
0 False
1 False
2 True
3 True
4 True
5 False
6 False
defined_min_length = 4
0 False
1 False
2 False
3 False
4 False
5 False
6 False
编辑:尝试解决问题的歧义。关键是“定义的长度”。例如。在示例中,定义的lenght = 4将产生所有False,因为任何设备(具有相同的“ SN”)在数据帧中都没有长度为4的正行程。
编辑2:我重新提出原始问题。添加变量define_min_length以指示所需的游程长度。
答案 0 :(得分:1)
使用:
def ExtractPositiveSequence(df,defined_min_length):
group_s= df.groupby(['SN',df['B'].lt(0).cumsum()])['B']
return ( group_s.transform('size')
.sub(group_s.transform('first')
.lt(0)
.astype(int))
.ge(defined_min_length)
.mul(df['B'].gt(0))
)
ExtractPositiveSequence(df,2)
0 False
1 False
2 True
3 True
4 True
5 False
6 False
Name: B, dtype: bool
ExtractPositiveSequence(df,3)
0 False
1 False
2 True
3 True
4 True
5 False
6 False
Name: B, dtype: bool
ExtractPositiveSequence(df,4)
0 False
1 False
2 False
3 False
4 False
5 False
6 False
Name: B, dtype: bool
注意:
如果要在正序列之前包含初始负数,请删除.mul(df['B'].gt(0))
。
要搜索否定序列: ExtractPositiveSequence(df.assign(B=df['B'].mul(-1)), n)