【问题标题】:My filter stops working when I add another layer of bitwise operation当我添加另一层按位运算时,我的过滤器停止工作
【发布时间】:2020-09-07 14:51:20
【问题描述】:

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

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)

它旨在返回以下国家/地区的数据框:a) 交易至少 9 个月且每月交易少于 2500 美元,或 b) 交易最多 3 个月且每月交易至少 250000 美元。就像之前的意思一样,输出应该包含不超过 3 或不低于 9 的 len 值,但我得到了这个:

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

【问题讨论】:

  • 不要使用&amp;|,而是使用andor。它们完全不同。
  • @venky__ - 在这种情况下,按位运算符在 andor 上是正确的。

标签: python pandas dataframe filter bitwise-operators


【解决方案1】:

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

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

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])

【讨论】:

    猜你喜欢
    • 2021-07-08
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多