Вы должны выполнить слияние данных, а затем применить фильтр к результирующему кадру данных.
Также, если "second_classes_column"
имеет более одного уникального "label_col"
, назначенного ему, тогда он недействителен, поэтому вы можете предварительно -считать количество label_cols, связанных с каждым "second_classes_column"
.
# setup some useful variables
main_classes = pd.DataFrame({"main_classes": list_main_classes})
count_unique_classes = data.groupby("second_classes_column")["label_col"].nunique().to_dict()
def your_logic(x):
second_id = x["second_classes_column"]
label_col = x["label_col"]
case1 = second_id != "certain_class"
case2 = count_unique_classes[second_id] > 1
return case1 and case2
# merge the two data frames
joint_df = pd.merge(data, main_classes, left_on="label_col", right_on="main_classes")
# now you can easily do the filter and perform your logic
to_drop = joint_df.apply(your_logic, axis=1)
list_main_indexes_to_drop = joint_df[to_drop].main_classes
Итак, результат:
>>> list_main_indexes_to_drop.values
... array([4])
Окончательный список можно получить, используя filter
, операции установки или np.setdiff1d
>>> list(set(list_main_classes) - set(list_main_indexes_to_drop))
... [3]
или
>>> np.setdiff1d(list_main_classes, list_main_indexes_to_drop)
... array([3])
Обновить . Вам могут не понравиться your_logic
и apply
, поэтому вы можете сделать это с помощью векторизованных логических операций, например:
# setup some useful variables
main_classes = pd.DataFrame({"main_classes": list_main_classes})
count_unique_classes = data.groupby("second_classes_column")["label_col"].nunique().ge(2)
invalid_classes = set(count_unique_classes[count_unique_classes].index)
# merge the two data frames
joint_df = pd.merge(data, main_classes, left_on="label_col", right_on="main_classes")
# your logic
joint_df = joint_df[
(joint_df.second_classes_column != "certain_class") &
(joint_df.second_classes_column.isin(invalid_classes))
]
# now you can easily do the filter and perform your logic
list_main_indexes_to_drop = joint_df.main_classes
list_main_indexes_to_drop.values