From 4b7af327d8d6ed5df55d069ff59f69359dd584cb Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Wed, 29 Oct 2025 12:16:14 -0400 Subject: [PATCH 1/2] is_contained_by update --- .../check_operators/dataframe_operators.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cdisc_rules_engine/check_operators/dataframe_operators.py b/cdisc_rules_engine/check_operators/dataframe_operators.py index 2d022650c..d8586db2a 100644 --- a/cdisc_rules_engine/check_operators/dataframe_operators.py +++ b/cdisc_rules_engine/check_operators/dataframe_operators.py @@ -13,6 +13,7 @@ apply_regex, vectorized_compare_dates, apply_rounding, + is_in, ) from cdisc_rules_engine.constants import NULL_FLAVORS @@ -654,10 +655,26 @@ def is_contained_by(self, other_value): # column name provided comparator = self.replace_prefix(comparator) comparison_data = self.get_comparator_data(comparator, value_is_literal) - if self.is_column_of_iterables(comparison_data): - results = vectorized_is_in(self.value[target], comparison_data) + target_data = self.value[target] + if self.is_column_of_iterables(target_data): + results = [] + for i in range(len(target_data)): + target_val = target_data.iloc[i] + comp_val = ( + comparison_data.iloc[i] + if hasattr(comparison_data, "iloc") + else comparison_data + ) + if isinstance(target_val, list): + result = any(is_in(item, comp_val) for item in target_val) + else: + result = is_in(target_val, comp_val) + results.append(result) + results = pd.Series(results) + elif self.is_column_of_iterables(comparison_data): + results = vectorized_is_in(target_data, comparison_data) else: - results = self.value[target].isin(comparison_data) + results = target_data.is_in(comparison_data) return self.value.convert_to_series(results) @log_operator_execution From b0b23fe7b4aaa2088ddef143099ae2bc70433379 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Wed, 29 Oct 2025 15:46:52 -0400 Subject: [PATCH 2/2] update --- cdisc_rules_engine/check_operators/dataframe_operators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdisc_rules_engine/check_operators/dataframe_operators.py b/cdisc_rules_engine/check_operators/dataframe_operators.py index d8586db2a..fa9715e9e 100644 --- a/cdisc_rules_engine/check_operators/dataframe_operators.py +++ b/cdisc_rules_engine/check_operators/dataframe_operators.py @@ -674,7 +674,7 @@ def is_contained_by(self, other_value): elif self.is_column_of_iterables(comparison_data): results = vectorized_is_in(target_data, comparison_data) else: - results = target_data.is_in(comparison_data) + results = target_data.isin(comparison_data) return self.value.convert_to_series(results) @log_operator_execution