2016-08-02 19 views
1

注:正確な問題を正確に特定するために、このコードと背景情報をかなり単純化しました。このコードの追加的な側面について私に説明したいのであれば、コメントで尋ねてください。Pandas DataFrameの特定のセルに列の変数名と行に基づいて情報を追加するにはどうすればよいですか?

私は現在、最終的には、以下の基本的なセットを含む.csvファイルを作成するために2つの以上の辞書を集約できるコードを作成しようとしています

    TF-A  TF-A  TF-B  TF-B  
ids gene name score sum hits score sum hits ... gene description 
id1 gene A 53.85   14  37.65  7 ... stuff 
id2 gene B 97.55   11  63.94  8 ... stuff 
id3 gene C 88.67   9  79.43  12 ... stuff 
id4 gene D 69.35   12  13.03  13 ... stuff 
... ...... ......  ...  ...  ... .......... 
idx gene Z 49.32   8  84.03  10 ... stuff 

辞書はキーとして遺伝子の名前が含まれています対応する値はスコアの配列である(これらのスコアは、ある位置の遺伝子に結合する転写因子、別名TFの確率を計算することによって生成される)。各TFには1つのdictがあり、そのキーには少なくとも1つのスコアを持つ遺伝子しか含まれていません。ディクショナリを開いた後、セット交差点を使用して、すべての転写因子が共通して持つ遺伝子のリストを生成し、forループの「遺伝子名」列のデータフレームに編成します。前に構築したクラス構造(図示せず)のために、各遺伝子の共通名と説明を簡単に取得し、df.set_valueを使用して「gene description」列に配置することができます。

for id in common_names: 
    gene_name= idconverter.getgene(id).gene_name 
    gene_description= idconverter.getgene(id).description 
    df.set_value(id,'gene name', gene_name) 
    df.set_value(id,'gene name', gene_description) 

ただし、データフレーム内の列の数は、ユーザーが解析したい転写因子の数に依存します。したがって、2つのTFを配置するユーザは、TF-Aの2つのカラム(得点と得点の合計、つまり「ヒット数」)とTF-Bの2つのカラムをデータフレームに追加します。 3つのTFを入力すると6つの列が得られ、4つのTFを入力すると8つの列が得られます。 ID、遺伝子名、および説明列は定数です。

私はデータフレームを作成する前に、与えられたTFごとに展開するリストを作成します。

ColumnList = [] 
for tf_id in tf_id_list:  
    ColumnList+=['{} Total Sum of Hits'.format(tf_id), '{} Number of Hits'.format(tf_id)] 

このリストでは、他の列名と連結してデータフレームをインスタンス化します。

df= DataFrame(columns= ['ids','gene name']+ColumnList+['gene description']) 

上記のように、データフレーム内の正しいセルに名前と説明を簡単に設定できます。そして、私は簡単に各遺伝子のヒット数と総得点を計算することができます。元のdictからどのTFを選んだのですか?列の数は入力されたTFに依存するので、この可変数の列に対応するためにどのようなコードを書くべきか、またはそのTFに基づいて列を指定する方法はわかりません。誰か私に適切なコードの設定やメソッドを教えてもらえますか?

私はいくつかの研究を行いましたが、別の列(ただし同じ行)にどのような種類の情報があるかに基づいてセルに特定の情報を追加する方法を見てきました:

Modifying a subset of rows in a pandas dataframe

df.ix[df.A==0, 'B'] = np.nan 

あなたは上記のリンクでコードを読み取る場合、ゼロが「A」の列に存在するときはいつでも、上記のコードのこの部分は、「B」カラムにはNaNに追加します。私はこの方法論を利用できると思ったが、最初のTF、2番目のTF、3番目のTFなどと関連するかどうかに基づいて、ヒット数と合計スコアを追加する必要があることを考えれば、どちらかと書いてください:

for id in common_genes: 
    for tf_id in tf_id_list: 
     df.ix[df.'{} Number of Hits'.format(tf_id)== tf_id]= number_hits 
     df.ix[df.'{} Total Sum of Scores'.format(tf_id)== tf_id]= sum_scores  

私のIDEは構文がコンパイルされていないと言っているので、正しいとは思いません。また、私は上記のコードを少し簡略化していることに注意してください。変数 "number_hits"と "sum_scores"は実際にキーとして遺伝子名を含む辞書と、ヒット、スコアサム、および関連するTF名のリストから派生しています値として。

答えて

0

最後に、私はdictsのdictを作成することにしました。このデータ構造が実際に必要なものに最も理想的だと分かりました。元のdictの情報はdict内部( "total_dict")に格納され、遺伝子がcommon_genesのリストに存在する場合にのみアクセスされます(これは、すべての転写因子共通していた)。それらは、forループがtotal_dictのTFを通過して遺伝子idがTF dictに存在するかどうかを決定することによってアクセスされ、もしそうであれば、値の情報(すなわち、スコアとヒット数の合計)は(遺伝子名またはidに基づいて)正しい行に追加されます(手元のTFに基づいて)。あなたは異なる種類のデータの多くを扱っている場合

for id in common_names: 
    gene_name= idconverter.getgene(id).gene_name 
    gene_description= idconverter.getgene(id).description 
    df.set_value(id,'gene name', gene_name) 
    df.set_value(id,'gene name', gene_description) 
    for tf_id in total_dict.keys(): 
     if id in total_dict[tf_id].keys(): 
      df.set_value(id, '{} Score Sum'.format(tf_id), total_dict[tf_dict][id][0]) 
      df.set_value(id, '{} Score Sum'.format(tf_id), total_dict[tf_dict][id][1]) 
print(df.header()) 

かいつまんで、あなたが生成したい結果の種類を構築するために操作することが可能と連携データ構造の種類を確認してください。

関連する問題