以下のデータ構造を持つファイル内:コンテキスト依存の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のすべての行に移動し、両方のファイルのすべての行が完了するまで続けます。
提案があります。どんな助け?
出力結果を最終結果として表示する出力データフレームを作成できますか? –
入力ファイルは、列(PB)までの上記のデータです。出力ファイルは、PB列とPID列の情報に基づいて、最後の列を入力ファイルに追加するだけです。 – everestial007
こんにちは@TedPetrou:あなたは今問題を理解していますか? PID(5398)はPB(1311)に関連付けられていることがわかります。これは、PIDが以前に関連付けられていたため、PB(1398)が実際にPBに含まれています。 – everestial007