Python/pandas中组合数据帧的自动生成

2024-03-29 11:12:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫和Python还很陌生,我有生物化学和药物发现的背景。我想自动化的一个常见任务是将药物治疗和蛋白质的组合列表转换为包含所有这些组合的格式。在

例如,如果我有一个包含给定组合集的数据帧: https://github.com/colinhiggins/dillydally/blob/master/input.csv,我想把它变成{a2},这样每个蛋白质(1、2和3)被复制n次到一个输出数据框中,其中的行数n是药物数量和药物浓度加上每个蛋白质的一个非药物行。在

理想情况下,结合的程度将由其他一些表来决定,这些表表明了关系,例如,如果蛋白质1和2要用药物1、2和3治疗,而蛋白质2没有用任何药物治疗。在

我在想某种嵌套的for loop是必需的,但是我不能完全理解如何启动它。在


Tags: 数据httpsgithubmastercom列表格式蛋白质
3条回答

我比以前的版本改进了

  1. 将其包含在函数中

  2. 从另一个输入CSV文件中添加了一个不使用药物治疗的蛋白质的检查,该文件在a列中包含相同的蛋白质,在B列标记为“用药物治疗”中为真或假。

  3. 跳过空值。我注意到我的例子输入.csv有相等长度的列,如果它们的长度不相等,函数开始对NaN行执行一些操作。

  4. 初始字典键是从初始输入CSV的列中设置的,而不是硬编码它们。

我用一些真实的数据测试了这一点(因此输入.csv到realinput.csv版),而且效果很好。在

完整功能的python文件的代码如下:

import pandas
import os
os.chdir("path_to_directory_containing_realinput_and_boolean_file")
realinput = pandas.read_csv('realinput.csv')
rows_list = []
dict1 = dict.fromkeys(realinput.columns,"")
prot_drug_bool = pandas.read_csv('protein_drug_bool.csv')
prot_drug_bool.index = prot_drug_bool.protein
prot_drug_bool = prot_drug_bool.drop("protein",axis=1)

def null_check(value):
    return pandas.isnull(value)

def combinator(input_table):
    for unique_protein in input_table.protein.unique():
        dict1 = dict.fromkeys(realinput.columns,"")
        dict1['protein']=unique_protein
        rows_list.append(dict1)
        if prot_drug_bool.ix[unique_protein]:
            for unique_drug in input_table.drug.unique():
                if not null_check(unique_drug):
                    for unique_drug_conc in input_table.drug_concentration.unique():
                        if not null_check(unique_drug_conc):
                            dict1 = dict.fromkeys(realinput.columns,"")
                            dict1['protein']=unique_protein
                            dict1['drug']=unique_drug                        
                            dict1['drug_concentration']=unique_drug_conc
                            rows_list.append(dict1)
    df = pandas.DataFrame(rows_list)
    return df
df2 = combinator(realinput)
df2.to_csv('realoutput.csv')

我仍然希望通过摆脱硬编码任何字典键和让用户定义输入.csv列标题指示输出。另外,我想离开定义的三列设置来处理任意数量的列。在

我在add one row in a pandas.DataFrame的帮助下,使用ShikharDua推荐的方法创建dict列表,每个dict对应于最终数据帧中的一行。在

代码是:

data = pandas.read_csv('input.csv')
dict1 = {"protein":"","drug":"","drug_concentration":""} #should be able to get this automatically using the dataframe columns, I think
rows_list = []
for unique_protein in data.protein.unique():
    dict1  = {"protein":unique_protein,"drug":"","drug_concentration":""}
    rows_list.append(dict1)
    for unique_drug in data.drug.unique():
        for unique_drug_conc  in data.drug_concentration.unique():
            dict1  = {"protein":unique_protein,"drug":unique_drug,"drug_concentration":unique_drug_conc}
            rows_list.append(dict1)
df = pandas.DataFrame(rows_list)
df

它不像我希望的那样灵活,因为不含药物的蛋白质的额外行是硬编码到嵌套的for循环中,但至少这是一个开始。我想我可以在每个for循环中添加一些if语句。在

考虑以下解决方案

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的功能类似。在

相关问题 更多 >