Skip to main content
 首页 » 编程设计

python之Python/pandas 中的自动组合 DataFrame 生成

2025年05月04日10artech

我对 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 的功能。 .