如何用True/False语句在python中测试所有可能的组合?
How to test all possible combinations with True/False Statement in python?
我有两个 DataFrame,每列包含 True/False 语句。我正在寻找一种方法来测试所有可能的组合,并找出 df1 中每一行的 "True" 也是 df2 中相应行中的 "True" 的位置。
参考下面的数据,逻辑是这样的:
对于从第 "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]
感谢任何有关如何解决此问题的帮助!
您可以使用 itertools to extract all the possible combinations of the columns of the 2 data frames, and then use the product()
function in pandas 中的 combinations()
函数来识别所考虑组合中所有列都等于 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
我有两个 DataFrame,每列包含 True/False 语句。我正在寻找一种方法来测试所有可能的组合,并找出 df1 中每一行的 "True" 也是 df2 中相应行中的 "True" 的位置。
参考下面的数据,逻辑是这样的:
对于从第 "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]
感谢任何有关如何解决此问题的帮助!
您可以使用 itertools to extract all the possible combinations of the columns of the 2 data frames, and then use the product()
function in pandas 中的 combinations()
函数来识别所考虑组合中所有列都等于 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