2

私は pandas と python にまったく慣れていません。生化学と創薬のバックグラウンドを持っています。私が自動化したい頻繁なタスクの 1 つは、薬物治療とタンパク質の組み合わせのリストを、そのようなすべての組み合わせを含む形式に変換することです。

たとえば、特定の組み合わせのセットを含む DataFrame がある場合: https://github.com/colinhiggins/dillydally/blob/master/input.csv 、それをhttps://github.comに変換したいと思います。 /colinhiggins/dillydally/blob/master/output.csv各タンパク質 (1、2、および 3) が出力 DataFrame に n 回コピーされるようにします。ここで、行数 n は、薬物の数および薬物濃度に 1 を加えたものです。各タンパク質の薬物なしの行。

理想的には、組み合わせの程度は、関係を示す他の表によって決定されます。たとえば、タンパク質 1 と 2 が薬剤 1、2、および 3 で治療されるが、そのタンパク質 2 は薬剤で治療されない場合です。

ある種のネストされた forloopが必要になると思いますが、それを開始する方法について頭を悩ませることはできません。

4

3 に答える 3

2

次の解決策を検討してください

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

これは基本的に、モジュールproduct内の関数の機能であるデカルト積です。itertools他の列に nan を持つタンパク質をリストするだけの空の行が必要な理由は、確かに混乱しています。それが意図的だったのか偶然だったのかはわかりません。データ型が均一で数値の場合、これはmeshgridと呼ばれるものと同様の機能です。

于 2018-02-02T02:14:04.743 に答える
0

私はpandas.DataFrame に 1 つの行を追加することで、この一部を処理しました。これには、最終的な DataFrame の行に対応する辞書のリストを作成する ShikharDua が推奨する方法が使用されています。

コードは次のとおりです。

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ループにハードコードされているため、私が望んでいたほど柔軟ではありませんが、少なくともそれは始まりです. 各ループif内にいくつかのステートメントを追加できると思います。for

于 2013-09-08T17:33:57.940 に答える