按位""以及未指定数量的数据帧掩码?

时间:2017-08-08 20:00:19

标签: python pandas dataframe logical-operators

所以我过去经常组合数据帧掩码: final_mask = mask1 & mask2

但如果我想结合很多面具怎么办?例如,列表: [mask1, mask2, mask3, mask4, ..., mask20]

2 个答案:

答案 0 :(得分:1)

您可以使用pandas cookbook solution,最后一段reduce

df = pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
print (df)
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

mask1 = df.AAA <= 5.5
mask2 = df.BBB == 10.0
mask3 = df.CCC > -40.0

masks = [mask1, mask2, mask3]
mask = functools.reduce(lambda x,y: x & y, masks)

print (df[mask])
   AAA  BBB  CCC
0    4   10  100

ayhan评论工作于1d掩码(掩码为Series)的另一个解决方案:

mask = np.logical_and.reduce(masks)

print (df[mask])
   AAA  BBB  CCC
0    4   10  100

正如ayhan指出的那样,第一个解决方案也适用于2D个掩码:

mask1 = df <= 5.5
mask2 = df < 1.0
mask3 = df > -40.0

masks = [mask1, mask2, mask3]
mask = functools.reduce(lambda x,y: x & y, masks)
print (mask)
     AAA    BBB    CCC
0  False  False  False
1  False  False  False
2  False  False   True
3  False  False  False
mask = np.logical_and.reduce(masks)
print (mask)
  

ValueError:无法将大小为4的序列复制到维度为3的数组轴

答案 1 :(得分:0)

可能最简单的方法是使用for循环:

final_mask = mask1
for mask in [mask2, mask3, mask4]:
    final_mask = final_mask & mask

请注意,虽然这很容易理解,但这种方式可能不被认为是最好的&#34; pythonic&#34;办法。正如其他人所指出的那样,使用reduce可以缩短您的代码,但新手可能不会更容易阅读。