如果 frozensets 具有特定元素,则过滤它们的数据框
filter dataframe of frozensets if they have a certain elemnet
我想过滤具有关联规则结果的数据框。在我的案例中,我想要包含 H 或 L 等元素的前因。前提是 frozenset 类型。我尝试了 Hrules,但它不起作用。
Hrules=fdem_rules['H' in fdem_rules['antecedents']]
Hrules=fdem_rules[frozenset({'H'}) in fdem_rules['antecedents']]
没用
在下面的示例中,我只需要第 46 行和第 89 行,因为它们具有 H。
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'})]})
antecedents
75 (N, M, 60)
46 (H, AorE)
89 (0-35, H, AorE, 60)
103 (AorE, M, 60, 0)
38 (0-35, F)
set/frozenset 方法
你可以使用apply
和set/frozenset的方法。这里要检查是否至少存在 H 或 L,可以使用 {'H', 'L'}.isdisjoint
:
的否定
match = {'H', 'L'}
df['H or L'] = ~df['antecedents'].apply(match.isdisjoint)
上面的一个更快的变体是使用列表理解:
match = {'H', 'L'}
df['H or L'] = [not match.isdisjoint(x) for x in df['antecedents']]
爆炸+isin+聚合
另一种选择是 explode
冻结集,使用 isin
,并将结果与 groupby
+any
:
聚合
match = {'H', 'L'}
df['H or L'] = df['antecedents'].explode().isin(match).groupby(level=0).any()
输出:
>>> 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
对匹配行进行切片
match = {'H', 'L'}
idx = [not match.isdisjoint(x) for x in df['antecedents']]
df[idx]
输出:
antecedents consequents other_cols
46 (H, AorE) (N) ...
89 (0-35, H, AorE, 60) (0) ...
我想过滤具有关联规则结果的数据框。在我的案例中,我想要包含 H 或 L 等元素的前因。前提是 frozenset 类型。我尝试了 Hrules,但它不起作用。
Hrules=fdem_rules['H' in fdem_rules['antecedents']]
Hrules=fdem_rules[frozenset({'H'}) in fdem_rules['antecedents']]
没用
在下面的示例中,我只需要第 46 行和第 89 行,因为它们具有 H。
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'})]})
antecedents
75 (N, M, 60)
46 (H, AorE)
89 (0-35, H, AorE, 60)
103 (AorE, M, 60, 0)
38 (0-35, F)
set/frozenset 方法
你可以使用apply
和set/frozenset的方法。这里要检查是否至少存在 H 或 L,可以使用 {'H', 'L'}.isdisjoint
:
match = {'H', 'L'}
df['H or L'] = ~df['antecedents'].apply(match.isdisjoint)
上面的一个更快的变体是使用列表理解:
match = {'H', 'L'}
df['H or L'] = [not match.isdisjoint(x) for x in df['antecedents']]
爆炸+isin+聚合
另一种选择是 explode
冻结集,使用 isin
,并将结果与 groupby
+any
:
match = {'H', 'L'}
df['H or L'] = df['antecedents'].explode().isin(match).groupby(level=0).any()
输出:
>>> 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
对匹配行进行切片
match = {'H', 'L'}
idx = [not match.isdisjoint(x) for x in df['antecedents']]
df[idx]
输出:
antecedents consequents other_cols
46 (H, AorE) (N) ...
89 (0-35, H, AorE, 60) (0) ...