【问题标题】:bitwise "&"ing an unspecified number of dataframe masks?按位“&”指定数量的数据帧掩码?
【发布时间】:2017-08-08 20:00:19
【问题描述】:

所以我习惯于像这样组合数据框掩码: final_mask = mask1 & mask2

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

【问题讨论】:

标签: python pandas dataframe logical-operators


【解决方案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

ayhan1d 掩码上的另一个解决方案(掩码为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 的数组轴

【讨论】:

  • 我无法让np.logical_and.reduce(masks) 处理二维蒙版。不过你的工作。
【解决方案2】:

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

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

请注意,虽然它很容易理解,但这种方式可能不被认为是最“pythonic”的方式。正如其他人所指出的,使用reduce 可以使您的代码更短,但新手可能不容易阅读。

【讨论】:

  • 这种方式完全符合 Python 风格。 reduce 被移出全局命名空间是有原因的...
猜你喜欢
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2014-02-07
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多