熊猫从基于列的布尔掩码创建基于行的布尔掩码

时间:2019-12-22 09:06:55

标签: python pandas

我不确定如何最好地从基于列的布尔掩码创建基于行的布尔掩码。

我试图从一个“ 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以指示所需的游程长度。

1 个答案:

答案 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)