注:正確な問題を正確に特定するために、このコードと背景情報をかなり単純化しました。このコードの追加的な側面について私に説明したいのであれば、コメントで尋ねてください。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名のリストから派生しています値として。