我有一个类似于此的数据框:
Disease Gene1 Gene2 Gene3 Gene4
D1 0.10 0.12 0.26 0.1
D2 1.00 1.00 0.01 0.13
D3 0.1 0.18 0.50 0.17
D4 0.25 0.10 0.31 0.41
D5 0.01 0.01 0.21 0.44
D6 0.31 0.33 0.81 0.12
D7 0.61 0.03 0.41 0.36
D8 0.05 0.84 0.38 0.83
但它大约有500列宽,数千行深。
对于每种疾病,我想考虑基因列的所有组合,其总和产生的疾病值高于任何其他疾病。
从这组组合中,我想选择最短的那些。
从最短的那些中,我希望选择哪个组合 产生该疾病的最大值。
例如,对于D2,Gene1 + Gene2具有最高的总和。
正如你在这种情况下猜测的那样,顺序并不重要。我希望这样做 感。谢谢你的时间。
修改
我认为问题是我没有正确地将数据传输到powerset。代码只是在没有给出结果或超时的情况下运行。
import itertools as IT
import numpy as np
import pandas as pd
import time
start = time.time()
def PP():
PP = pd.read_csv('datainfile.csv')
return PP
PP = PP()
#np.random.seed(2015)
def powerset(iterable, reverse=False, rvals=None):
"""powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"""
s = list(iterable)
N = len(s)
if rvals is None:
rvals = range(N, -1, -1) if reverse else range(N + 1)
return IT.chain.from_iterable(
IT.combinations(s, r) for r in rvals)
# df = pd.read_table('data', sep='\s+')
#ncols, nrows, ndiseases = 515, 5000, 200
Genes_list = list(PP.iloc[[0],1:].columns)
concatHS_list = list(PP.iloc[0:,0])
PP = PP.set_index(['concatHS'])
result = dict()
for combo in powerset(PP.columns):
if len(combo) < 2: continue
concatHS = PP[list(combo)].sum(axis=1).argmax()
if concatHS not in result:
result[concatHS] = combo
if not set(PP.index).difference(result.keys()):
break
for concatHS, combo in result.items():
print('{}: {}'.format(concatHS, combo))
end = time.time()
elapsed = end - start
print("Time elapsed:", elapsed)