我对 pandas 和 python 还很陌生,而且我有生物化学和药物发现方面的背景。我想自动执行的一项常见任务是将药物治疗和蛋白质组合列表转换为包含所有此类组合的格式。
例如,如果我有一个包含一组给定组合的 DataFrame: https://github.com/colinhiggins/dillydally/blob/master/input.csv , 我想把它变成 https://github.com/colinhiggins/dillydally/blob/master/output.csv这样每个蛋白质(1、2 和 3)都被复制 n 次到输出 DataFrame,其中行数 n 是药物和药物浓度的数量加上每个蛋白质的无药物行。
理想情况下,组合的程度将由表示关系的其他一些表决定,例如,如果蛋白质 1 和 2 将用药物 1、2 和 3 治疗,但蛋白质 2 未用任何药物治疗.
我认为需要某种嵌套的 loop,但我不知道如何开始它。
请您参考如下方法:
考虑以下解决方案
from itertools import product
import pandas
protein = ['protein1' , 'protein2' , 'protein3' ]
drug = ['drug1' , 'drug2', 'drug3']
drug_concentration = [100,30,10]
df = pandas.DataFrame.from_records( list( i for i in product(protein, drug, drug_concentration ) ) , columns=['protein' , 'drug' , 'drug_concentration'] )
>>> df
protein drug drug_concentration
0 protein1 drug1 100
1 protein1 drug1 30
2 protein1 drug1 10
3 protein1 drug2 100
4 protein1 drug2 30
5 protein1 drug2 10
6 protein1 drug3 100
7 protein1 drug3 30
8 protein1 drug3 10
9 protein2 drug1 100
10 protein2 drug1 30
11 protein2 drug1 10
12 protein2 drug2 100
13 protein2 drug2 30
14 protein2 drug2 10
15 protein2 drug3 100
16 protein2 drug3 30
17 protein2 drug3 10
18 protein3 drug1 100
19 protein3 drug1 30
20 protein3 drug1 10
21 protein3 drug2 100
22 protein3 drug2 30
23 protein3 drug2 10
24 protein3 drug3 100
25 protein3 drug3 30
26 protein3 drug3 10
这基本上是您所追求的笛卡尔积,它是 itertools 模块中的 product 函数的功能。诚然,我很困惑为什么你想要空行来列出其他列中带有 nan 的蛋白质。不确定那是故意的还是偶然的。如果数据类型是统一的和数字的,这类似于所谓的 meshgrid 的功能。 .
