首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果具有特定的项目网,则对冻结集进行数据过滤。

如果具有特定的项目网,则对冻结集进行数据过滤。
EN

Stack Overflow用户
提问于 2022-01-05 08:12:42
回答 1查看 158关注 0票数 1

我想过滤一个具有关联规则结果的数据帧。在我的例子中,我想要包含像H或L这样的元素的前因。其前缘为冻融型。我试过了,但没有用。

代码语言:javascript
复制
Hrules=fdem_rules['H'  in fdem_rules['antecedents']]
Hrules=fdem_rules[frozenset({'H'})  in fdem_rules['antecedents']] 

不管用

在下面的示例中,我只需要第46行和第89行,因为它们有H。

代码语言:javascript
复制
df = pd.DataFrame({'antecedents': [frozenset({'N', 'M', '60'}), frozenset({'H', 'AorE'}), frozenset({'0-35', 'H', 'AorE', '60'}), frozenset({'AorE', 'M', '60', '0'}), frozenset({'0-35', 'F'})]})
代码语言:javascript
复制
             antecedents
75            (N, M, 60)
46             (H, AorE)
89   (0-35, H, AorE, 60)
103     (AorE, M, 60, 0)
38             (0-35, F)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-05 08:47:01

set/frozenset方法

您可以在set/frozenset的方法中使用apply。这里检查是否至少存在H或L,可以使用{'H', 'L'}.isdisjoint的否定

代码语言:javascript
复制
match = {'H', 'L'}
df['H or L'] = ~df['antecedents'].apply(match.isdisjoint)

上面的一个更快的变体是使用列表理解:

代码语言:javascript
复制
match = {'H', 'L'}
df['H or L'] = [not match.isdisjoint(x) for x in df['antecedents']]

explode+isin+aggregate

另一个选项是使用explode,使用isin,并使用groupby+any聚合结果

代码语言:javascript
复制
match = {'H', 'L'}
df['H or L'] = df['antecedents'].explode().isin(match).groupby(level=0).any()

产出:

代码语言:javascript
复制
>>> df[['antecedents', 'H or L']]
             antecedents  H or L
75            (N, M, 60)   False
46             (H, AorE)    True
89   (0-35, H, AorE, 60)    True
103     (AorE, M, 60, 0)   False
38             (0-35, F)   False

切片匹配行

代码语言:javascript
复制
match = {'H', 'L'}
idx = [not match.isdisjoint(x) for x in df['antecedents']]
df[idx]

产出:

代码语言:javascript
复制
            antecedents consequents other_cols
46            (H, AorE)         (N)        ...
89  (0-35, H, AorE, 60)         (0)        ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70589625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档