【发布时间】:2020-09-07 14:51:20
【问题描述】:
- 数据可在此SO question 中获得。
我毫不怀疑解决方案非常简单,但我很难过。当我将以下过滤器应用于数据框时:
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 中看到的那样。 如何让它按预期工作?
【问题讨论】:
-
不要使用
&或|,而是使用and和or。它们完全不同。 -
@venky__ - 在这种情况下,按位运算符在
and和or上是正确的。
标签: python pandas dataframe filter bitwise-operators