2016-12-23 3 views
0

以下のデータ構造を持つファイル内:コンテキスト依存の2つの列のデータをマージするにはどうすればよいですか?

入力ファイルは列(PB)までのデータ以下です。

contig pos GT PGT  PID  PG  PB  updated_Block 
2  5426 0/1 0|1  5398 1|0 1311  1311 
2  5427 0/1 0|1  5398 0/1 .   1311 
2  5434 0/1 0|1  5398 1|0 1311  1311 
2  5454 0/1 0|1  5398 0/1 .   1311 
2  5457 0/0 .   .  0/0 .   . 
2  5467 0/1 0|1  5467 0|1 1311  1311 
2  5480 0/1 0|1  5467 0|1 1311  1311 
2  5483 0/0 0|1  5482 0/0 1667  1667 
2  5518 1/1 1|1  5467 1/1 .   1311 
2  5519 0/0 .   .  0/0 .   . 
2  5547 1/1 1|1  5467 1/1 .   1311 
2  5550 ./. .   .  ./. .   . 
2  5559 1/1 1|1  5467 1/1 .   1311 
2  5561 0/0 .   .  0/0 .   . 
2  5576 0/1 0|1  5576 1|0 1311  1311 
2  5599 0/1 0|1  5576 1|0 1311  1311 
2  5602 0/0 .   .  0/0 .   . 
2  5657 0/1 .   .  1|0 1311  1311 
2  5723 0/1 .   .  1|0 1311  1311 
2  6414 0/1 .   .  0|1 1667  1667 
2  6446 0/1 0|1  6446  0|1 1667  1667 
2  6448 0/1 0|1  6446  0|1 1667  1667 
2  6465 0/1 0|1  6446  0|1 1667  1667 
2  6636 0/1 .   .  1|0 1667  1667 
2  6740 0/1 .  6740  0|1 1667  1667 

出力ファイルには、入力データプラス(私は計算する必要があります)最後の列です。

PIDはブロックを表し、PGTは特定のプログラムによって生成されたブロック内のデータの1つを表します。 別のプログラムは、同じデータセットに対して同じタイプの情報を生成します.PBはブロックであり、PGはそのブロック内のデータの1つです。 これらの2つのプログラムは、異なる確率テストに基づいて値とブロック情報を出力します。

したがって、上記データ出力から:ブロックPB(1311)に属するデータは、PID(5398、5467及び5576)と同じブロックからのものです。できるだけ多くのブロックをマージしてブロックを最大限にするだけです。だから、私はちょうど重複するブロックを見つけてそれらを結合してより大きなブロックセットを作成する必要があります。 更新されたブロックは、最後の列(私は手で入力したもの)のように見えるはずです。

詳細: 1311 PBからPIDから5398、5467、5576と重なっている - そう、彼らは大きなブロックを作ります。 PID(5398)はPB(1311)に関連付けられていることがわかります。これは、PIDが以前に関連付けられていたため、PB(1398)には実際に属しています。更新されたブロックは、PBと同じ一意の値を持つことができます。

この問題を解決する方法は混乱しています。私は最初に辞書のリストを作成したかったのですが、大きなブロックを作ることができなくなるまで各行を読み込むことにはまだ問題があります。その後、他のブロック値を読み込んでもう一度最大のブロックを作り始めます。

以下

は、部分的なソリューションです。

私はこのような別のファイルやデータオブジェクトを作成することができます

PB_PID_group = data_frame.groupby("PI")["PID"].unique()

私を与える:

PI 
.    [., 5398, 5482, 5467] 
1311 [5185, ., 5398, 5467, 5576] 
1667      [., 6446] 
3352       [.] 
935        [.] 
Name: PID, dtype: object 

を私がドロップする必要があり上記の出力の最初の行と、他の行のperiods(.)です。 これはまだテーブル形式のデータではありません。私もこれを修正する必要があります。

だから、今、私は2つのファイルをロードし、ラインで両方のファイルの行の読み取り:今

file_1 = file_1.split('\n') 
file_2 = file_2.split('\n') 

for line in file_1 and file_2: 

    again split lines by tabs and then 

    PB_file1 = file_1[6] 
    PID_file1 = file_1[4] 

    PB_file2 = file_2[0] 
    PID_file2 = file_2[1].split(', ') 

を、私は検索しupdate_PBに

if PB_file1 is an integer: 
     update_PB = PB_file1 
    elif: 
     PB_file1 = '.' 
     if PID_file1 in PID_file2: 
      update_PB = PB_file2 
    else: 
     update_PB = '.' 

ので、この検索および更新を値を更新しますループはfile_1の最初の行とfile_2のすべての行を読み取ることで続行されます。もう一度file_1の2行目とfile_2のすべての行に移動し、両方のファイルのすべての行が完了するまで続けます。

提案があります。どんな助け?

+0

出力結果を最終結果として表示する出力データフレームを作成できますか? –

+0

入力ファイルは、列(PB)までの上記のデータです。出力ファイルは、PB列とPID列の情報に基づいて、最後の列を入力ファイルに追加するだけです。 – everestial007

+0

こんにちは@TedPetrou:あなたは今問題を理解していますか? PID(5398)はPB(1311)に関連付けられていることがわかります。これは、PIDが以前に関連付けられていたため、PB(1398)が実際にPBに含まれています。 – everestial007

答えて

0

私はちょうどPIDごとに辞書を作成します。各PIDに固有のPBはありますか?

あなたはグループPIDPBによって、もしあれば、重複してナン値を削除することができます。次に、必要な列を作成するには、テーブルPID PBが必要です。

+0

PBはほとんどの場合、各PIDに対して一意ですが、必ずしもそうではありません。それは私の主な問題です。これはビッグデータの一部にすぎません。 – everestial007

+0

私にパンダでコードを書くことができますか?私は実りあることが何も起こっていない私の最高を試みている。 – everestial007

+0

どのようにそのようなケースに対処したいですか?つまり、PIDに複数のPBがある場合はどうすればよいでしょうか?各PBを各PID(つまり多対多のマージ)にマージするだけです。 – frmo

1

同じPIDグループのピリオドをランダムPBに置き換えているようです。

df.groupby('PID')['PB'].transform(lambda x: x.replace('.', x.sort_values()[-1])) 

あなたの最後のコメントから、各PIDグループの最大値がほしいと思うようです。

df['updated_Block'] = df.groupby('PID')['PB'].transform('max') 

そして、あなたはPID期間は、対応する期間のエントリを持って、次のと期間に戻ってそれらを設定するようにする必要があります。

df.loc[df['PID'] == '.', 'updated_Block'] = '.' 
+0

これは私が望むものではありません。私は本当にこれをどうやって解決するのか分かりません。そのような複雑な文脈。 – everestial007

+0

これはなぜ機能しないのですか? –

+0

おそらくそれを一意の値を使ってマージすることができます。 PB_PID_group = data_frame.groupby( "PB")["PID"]。ユニーク() '。しかし、 'ピリオド(。) 'を削除する必要があります。その後、テーブルを作成し、2つのファイルを1行ずつ読み込み、最後のブロックの値をifを使用して更新します。私はパンダでピリオドを落とすことはできません。 – everestial007

関連する問題