首页 > 解决方案 > 如何在 python 中使用 True/False 语句测试所有可能的组合?

问题描述

我有两个 DataFrame,其中每一列都包含 True/False 语句。我正在寻找一种方法来测试所有可能的组合,并找出 df1 中每一行的“真”在 df2 中相应行中的“真”在哪里。

参考下面的数据,逻辑是这样的:

对于每一行,从“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]

任何有关如何解决此问题的帮助表示赞赏!

标签: pythonpandaslogicboolean-logic

解决方案


您可以使用itertoolscombinations()中的函数来提取 2 个数据帧的列的所有可能组合,然后使用pandas中的函数来识别所考虑组合中的所有列都等于 的行。我在下面提供了一个示例,它考虑了 2 列或 3 列的所有组合。product()True

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


推荐阅读