当我添加另一层按位运算时,我的过滤器停止工作

My filter stops working when I add another layer of bitwise operation

我毫不怀疑解决方案非常简单,但我被难住了。当我将以下过滤器应用于数据框时:

def filt(g):
return ((len(g)>=9) | (len(g)<=3))

milk_countries_exports_0401_filt=milk_countries_exports_0401.groupby(['Commodity','Partner']).filter(filt)
milk_countries_exports_0401_filt.groupby(['Commodity','Partner'])[['Trade Value (US$)']].aggregate([len,sum]).head(5)

我得到以下输出:

显然 len(在本例中表示交易的月数)小于或等于 3,或大于或等于 9。

但是一旦我使过滤器变得更复杂:

def filt(g):
       return ((len(g)>=9 & g['Trade Value (US$)'].max()<2500) | (len(g)<=3 & g['Trade Value (US$)'].min()>250000))

milk_countries_exports_0401_filt=milk_countries_exports_0401.groupby(['Commodity','Partner']).filter(filt)
milk_countries_exports_0401_filt.groupby(['Commodity','Partner'])[['Trade Value (US$)']].aggregate([len,sum]).head(5)

旨在 return 国家/地区的数据框,这些国家要么 a) 交易至少 9 个月且每月交易少于 2500 美元,要么 b) 交易最多 3 个月且交易额为每月至少 $250000。意思和前面一样,输出应该包含不超过 3 或不少于 9 的 len 值,但我得到这个:

这只显示了一个示例,因为我只显示了前 5 行,但是关于 len 的过滤器部分似乎已被忽略,正如您从英属维尔京群岛的 len 6 中看到的那样。 我如何让它按预期工作?

按位比较运算符 &| 比其他运算符绑定得更紧密。

将您的比较用括号括起来。

def filt(g): 
    case1 = (len(g) >= 9) & (g['Trade Value (US$)'].max() < 2500)
    case2 = (len(g) <= 3) & (g['Trade Value (US$)'].min() > 250000)
    return case1 | case2

df_filt = df.groupby(['Commodity','Partner']).filter(filt)
df_filt.groupby(['Commodity','Partner'])[['Trade Value (US$)']].aggregate([len,sum])