Как проверить все возможные комбинации с True / False Statement в python? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть два DataFrames, где каждый столбец содержит утверждения True / False. Я ищу способ протестировать все возможные комбинации и выяснить, где «True» для каждой строки в df1 также является «True» в соответствующей строке в df2.

Что касается приведенных ниже данных, лог c будет выглядеть примерно так:

Для каждой строки, начиная со столбца «Main1», проверьте, равна ли строка значению True, и если Строка в столбце «Sub1» также имеет значение True. Затем, проверьте, равна ли строка в «Main1» значению true, и имеет ли строка в столбце «Sub1» значение True, а столбец «sub2» также равен True. В этом случае, если все значения равны True, вывод будет True. Затем повторите для всех столбцов и всех возможных комбинаций.

df1:

   Main1  Main2  Main3
0   True  False   True
1  False  False  False
2  False   True   True
3  False  False   True
4  False   True   True
5   True   True   True
6   True  False  False

df2:

    Sub1   Sub2   Sub3
0  False  False   True
1  False   True  False
2   True  False   True
3  False  False  False
4   True   True  False
5  False  False  False
6   True   True   True

Вывод будет выглядеть примерно так.

Конечно, я мог бы сделать это вручную, но это было бы своевременно, а также было бы место для ошибок.

   Main1Sub1  Main1Sub1Sub2  ...  Main3Sub2Sub3  Main3Sub3
0      False          False  ...          False       True
1      False          False  ...          False      False
2      False          False  ...          False       True
3      False          False  ...          False      False
4      False          False  ...          False      False
5      False          False  ...          False      False
6       True           True  ...          False      False

[7 rows x 18 columns]

Любая помощь по решению этой проблемы приветствуется!

1 Ответ

2 голосов
/ 04 апреля 2020

Вы можете использовать функцию combinations() в itertools , чтобы извлечь все возможные комбинации столбцов 2 фреймов данных, а затем использовать функцию product() в pandas для идентификации строк, в которых все столбцы в рассматриваемой комбинации равны True. Ниже приведен пример, в котором рассматриваются все комбинации из 2 или 3 столбцов.

import pandas as pd
from itertools import combinations

df1 = pd.DataFrame({"Main1": [True, False, False, False, False, True, True],
                    "Main2": [False, False, True, False, True, True, False],
                    "Main3": [True, False, True, True, True, True, False]})

df2 = pd.DataFrame({"Sub1": [False, False, True, False, True, False, True],
                    "Sub2": [False, True, False, False, True, False, True],
                    "Sub3": [True, False, True, False, False, False, True]})

df3 = df1.join(df2)

all_combinations = list(combinations(df3.columns, 2)) + \
                   list(combinations(df3.columns, 3))

for combination in all_combinations:

   df3["".join(list(combination))] = df3[list(combination)].product(axis=1).astype(bool)

df3.drop(labels=["Main1", "Main2", "Main3", "Sub1", "Sub2", "Sub3"], axis=1, inplace=True)

df3

   Main1Main2  Main1Main3  ...  Main3Sub2Sub3  Sub1Sub2Sub3
0       False        True  ...          False         False
1       False       False  ...          False         False
2       False       False  ...          False         False
3       False       False  ...          False         False
4       False       False  ...          False         False
5        True        True  ...          False         False
6       False       False  ...          False          True

...