为了账号安全,请及时绑定邮箱和手机立即绑定

在Pandas中使用大型数据集的所有可能结果并对结果进行排序

在Pandas中使用大型数据集的所有可能结果并对结果进行排序

MMTTMM 2022-09-27 10:41:38
我有一个数据帧,有700行和5100列。每行都包含真或假。使用此df,我想测试列的所有可能组合,并使用结果测试每行是否等于True。前几天,我在这个帖子中得到了一位用户的极好帮助:如何在python中测试所有可能的组合与真/假陈述?,建议我使用itertools和“产品”中的“组合”。这对于小型数据集工作正常。但是,当将此方法应用于我的(大得多的)数据集时,在测试超过2的组合时,内存不足。我想要的输出与下面的示例类似,但我不会耗尽内存。感谢您的任何帮助。小数据集的建议方法:import pandas as pdfrom itertools import combinationsdf1 = 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  Sub1Sub2Sub30       False        True  ...          False         False1       False       False  ...          False         False2       False       False  ...          False         False3       False       False  ...          False         False4       False       False  ...          False         False5        True        True  ...          False         False6       False       False  ...          False          True
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

所以,我并不为这个感到骄傲,但也许它有机会获胜 :)......


我认为你需要离开数据帧,因为它不能长得足够大,无法正确保存你的结果。如果您的结果可预测地稀疏,则可以使用替代结构,如下所示。


请注意,对于您正在做的事情来说,这将是一个很长的循环,22B x数据帧的长度,因此超过一万亿次命中,但是如果您只需要做一次,谁在乎。中的组合函数是一个生成器,因此它将具有内存效率。itertools


我认为您正在寻找上面“全部为 True”的结果,因为您正在使用产品运算符。我在评论中说错了。


如果完成,您可以在下面添加第二个循环来覆盖大小2的组合!:)


import pandas as pd

from itertools import combinations


df = 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],

                    "Sub1": [False, False, True, False, True, False, True],

                    "Sub2": [False, True, False, False, True, False, True],

                    "Sub3": [True, False, True, False, False, False, True]})


print(df)

data = df.to_dict('index')


# test to see if it looks right for row 0

print(data[0])


# now the data is in a nested dictionary, which should be more "iterable"

results = []


for combo in combinations(df.columns, 3):

    for key in data:  # iterate through the rows in the data...  index is key.

        values = set(data[key][col] for col in combo)

        if all(values):

            results.append((key, combo))


# inspect results...

for result in results:

    print(f'row: {result[0]} columns: {results[1]} product is TRUE')

收益 率:


   Main1  Main2  Main3   Sub1   Sub2   Sub3

0   True  False   True  False  False   True

1  False  False  False  False   True  False

2  False   True   True   True  False   True

3  False  False   True  False  False  False

4  False   True   True   True   True  False

5   True   True   True  False  False  False

6   True  False  False   True   True   True

{'Main1': True, 'Main2': False, 'Main3': True, 'Sub1': False, 'Sub2': False, 'Sub3': True}

row: 5 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 0 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 6 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 6 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 6 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 2 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 4 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 4 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 2 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 4 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 2 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 4 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 2 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

row: 6 columns: (0, ('Main1', 'Main3', 'Sub3')) product is TRUE

[Finished in 0.6s]


查看完整回答
反对 回复 2022-09-27
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信