2

そのため、このコードを使用して、マスター シーケンス内の SOURCE として示されるサブシーケンスの開始位置と停止位置を出力しています。マスター シーケンスは GENE によって識別されます。GENE には + と - の 2 つの DIRECTION 成分を持つシーケンスがあり、これらは一意のシーケンスとして扱われます。しかし、私が気付いていなかったのは、最初にデータセットを生成する際に (多くの SOURCE シーケンスのファイルを GENE シーケンスに対して整列させることによって)、SOURCE シーケンスの複数の「有効な」整列が存在するインスタンスがいくつかあることです。 GENE配列に対して。SOURCE シーケンスの数が等しい場合、GENE シーケンス内で出現回数が最も少ない、または POS1 から最終 POS2 までの最小範囲で、SOURCE シーケンスからエントリを削除する方法が必要です。明確な例を含む出力例を以下に示します。

ここに私のPythonコードがあります:

import pandas
import pandas as pd
import sys
import csv

##sys.stdout = open("Sampletest2d.txt", "w")
##data = pd.read_csv('Sampletest2.txt', sep='\t')
sys.stdout = open("ExonFileTry1Part3.txt", "w")
data = pd.read_csv('ExonFileTry1.txt', sep='\t')
groups = data.groupby(['GENE', 'DIRECTION'])

fixedgroups = []

for (gene_id, strand), group in groups:
    #print gene_id, strand
    if strand == '+':
        group['POS-1'] = group.POS1
        group['POS-2'] = group.POS2
    else:
        group['POS-1'] = group.POS2
        group['POS-2'] = group.POS1
    #print group
    fixedgroups.append(group)
print fixedgroups

データセット (タブ区切り)

GENE    DIRECTION   POS1    POS2    SOURCE
TT-1    +   1   16  A1
TT-1    +   130 289 A1
TT-1    +   353 438 A1
TT-1    +   519 580 A1
TT-1    +   665 742 A1
TT-1    +   813 864 A1
TT-1    +   931 975 A1
TT-1    +   1053    1166    A1
TT-1    +   1   16  B2
TT-1    +   130 289 B2
TT-1    +   353 438 B2
TT-1    +   519 580 B2
TT-1    +   665 742 B2
TT-1    +   813 864 B2
TT-1    +   931 975 B2
TT-1    +   1053    1161    B2
BB-2    +   3   659 C3
BB-2    +   3   640 D4
BB-2    -   1093    426 E5
BB-2    -   1093    508 F6
EE-3    +   1   95  G7
EE-3    +   155 377 G7
EE-3    +   439 513 G7
EE-3    +   577 840 G7
EE-3    +   1   95  H8
EE-3    +   155 377 H8
EE-3    +   439 513 H8
EE-3    -   840 577 I9
EE-3    -   513 439 I9
EE-3    -   377 155 I9
EE-3    -   840 577 J10
EE-3    -   513 458 J10

GENE に複数の SOURCE 配列があり、ある SOURCE からの配列が別の SOURCE よりも多い場合があります。ただし、2 つの異なる SOURCE から同数のシーケンスが存在する場合があります。この場合、その SOURCE の最初の POS1 と最後の POS2 の間の値の範囲が最大の SOURCE を維持する必要があります。

たとえば、+ DIRECTION の GENE TT-1 には、2 つの SOURCE セット A1 と B2 があり、どちらも 8 つのエントリがあります。ただし、SOURCE A1 の最終 POS2 は 1166 ですが、B2 の最終 POS2 は 1161 であるため、B2 の範囲はより小さく、削除する必要があります。

私がすでに行ったことを行う方法を理解するだけで、信じられないほどの時間がかかりました。それは、同様のコードに基づいていました。ここでやりたいことはわかった気がしますが、コンピューター サイエンスの知識が非常に限られているため、構文がわかりません。事前に助けてくれてありがとう!

4

2 に答える 2

2

私はあなたが書いたすべてを完全に理解しているとは確信していませんが、あなたのデータと「たとえば」の段落から飛び出しています。したがって、B2 の範囲はより狭いため、削除する必要があります。」「TT-1 +」と「TT-1 -」を異なるエンティティとして処理し、各行の範囲を合計しています。それがあなたの望みだと思います。

DataFrame に RANGE 列を追加する

df['RANGE'] = abs(df['POS2']-df['POS1'])

次に、各シーケンス、ソースの組み合わせのソースごとにそれを累積します。

df['SUMRANGE'] = df.groupby(["GENE", "DIRECTION", "SOURCE"])['RANGE'].cumsum()

各シーケンスの「SUMRANGE」が最大の行のインデックスを抽出します。

dfm = pandas.DataFrame(df.ix[df.groupby(["GENE", "DIRECTION"]).agg(lambda df: df.idxmax())['SUMRANGE']])

join次に来る関数で使用するためのインデックスを設定します。

dfm.index = pandas.MultiIndex.from_arrays([dfm['GENE'], dfm['DIRECTION']])

df と dfm を結合します。

dfj = df.join(other=dfm['SOURCE'], on=['GENE', 'DIRECTION'], rsuffix='.r')

「SOURCE」が「SOURCE.r」と同じかどうかに基づいて dfj をフィルタリングするようになりました。

dfj[dfj.apply(lambda x: x['SOURCE'] == x['SOURCE.r'], axis=1)]

    GENE DIRECTION  POS1  POS2 SOURCE  RANGE  SUMRANGE SOURCE.r
0   TT-1         +     1    16     A1     15        15       A1
1   TT-1         +   130   289     A1    159       174       A1
2   TT-1         +   353   438     A1     85       259       A1
3   TT-1         +   519   580     A1     61       320       A1
4   TT-1         +   665   742     A1     77       397       A1
5   TT-1         +   813   864     A1     51       448       A1
6   TT-1         +   931   975     A1     44       492       A1
7   TT-1         +  1053  1166     A1    113       605       A1
16  BB-2         +     3   659     C3    656       656       C3
18  BB-2         -  1093   426     E5    667       667       E5
20  EE-3         +     1    95     G7     94        94       G7
21  EE-3         +   155   377     G7    222       316       G7
22  EE-3         +   439   513     G7     74       390       G7
23  EE-3         +   577   840     G7    263       653       G7
27  EE-3         -   840   577     I9    263       263       I9
28  EE-3         -   513   439     I9     74       337       I9
29  EE-3         -   377   155     I9    222       559       I9

もちろん、必要に応じて不要な列を削除することもできdfjます。参考までに、ここに私が始めた DataFrame を示します。

In [2]: df
Out[2]: 
    GENE DIRECTION  POS1  POS2 SOURCE
0   TT-1         +     1    16     A1
1   TT-1         +   130   289     A1
2   TT-1         +   353   438     A1
3   TT-1         +   519   580     A1
4   TT-1         +   665   742     A1
5   TT-1         +   813   864     A1
6   TT-1         +   931   975     A1
7   TT-1         +  1053  1166     A1
8   TT-1         +     1    16     B2
9   TT-1         +   130   289     B2
10  TT-1         +   353   438     B2
11  TT-1         +   519   580     B2
12  TT-1         +   665   742     B2
13  TT-1         +   813   864     B2
14  TT-1         +   931   975     B2
15  TT-1         +  1053  1161     B2
16  BB-2         +     3   659     C3
17  BB-2         +     3   640     D4
18  BB-2         -  1093   426     E5
19  BB-2         -  1093   508     F6
20  EE-3         +     1    95     G7
21  EE-3         +   155   377     G7
22  EE-3         +   439   513     G7
23  EE-3         +   577   840     G7
24  EE-3         +     1    95     H8
25  EE-3         +   155   377     H8
26  EE-3         +   439   513     H8
27  EE-3         -   840   577     I9
28  EE-3         -   513   439     I9
29  EE-3         -   377   155     I9
30  EE-3         -   840   577    J10
31  EE-3         -   513   458    J10
于 2013-02-27T19:04:32.417 に答える
2

@DAの回答のバリエーションは次のとおりです。

まず、いくつかのボイラープレートのセットアップ:

import pandas as pd
import io

data = '''\
GENE    DIRECTION   POS1    POS2    SOURCE
TT-1    +   1   16  A1
TT-1    +   130 289 A1
TT-1    +   353 438 A1
TT-1    +   519 580 A1
TT-1    +   665 742 A1
TT-1    +   813 864 A1
TT-1    +   931 975 A1
TT-1    +   1053    1166    A1
TT-1    +   1   16  B2
TT-1    +   130 289 B2
TT-1    +   353 438 B2
TT-1    +   519 580 B2
TT-1    +   665 742 B2
TT-1    +   813 864 B2
TT-1    +   931 975 B2
TT-1    +   1053    1161    B2
BB-2    +   3   659 C3
BB-2    +   3   640 D4
BB-2    -   1093    426 E5
BB-2    -   1093    508 F6
EE-3    +   1   95  G7
EE-3    +   155 377 G7
EE-3    +   439 513 G7
EE-3    +   577 840 G7
EE-3    +   1   95  H8
EE-3    +   155 377 H8
EE-3    +   439 513 H8
EE-3    -   840 577 I9
EE-3    -   513 439 I9
EE-3    -   377 155 I9
EE-3    -   840 577 J10
EE-3    -   513 458 J10'''

df = pd.read_table(io.BytesIO(data), sep='\t')

@DA と同じように、列を追加RANGEします。SUMRANGE

df['RANGE'] = abs(df['POS2']-df['POS1'])
df['SUMRANGE'] = df.groupby(["GENE", "DIRECTION", "SOURCE"])['RANGE'].cumsum()
print(df)
#     GENE DIRECTION  POS1  POS2 SOURCE  RANGE  SUMRANGE
# 0   TT-1         +     1    16     A1     15        15
# 1   TT-1         +   130   289     A1    159       174
# 2   TT-1         +   353   438     A1     85       259
# 3   TT-1         +   519   580     A1     61       320
# 4   TT-1         +   665   742     A1     77       397
# 5   TT-1         +   813   864     A1     51       448
# 6   TT-1         +   931   975     A1     44       492
# 7   TT-1         +  1053  1166     A1    113       605
# 8   TT-1         +     1    16     B2     15        15
# 9   TT-1         +   130   289     B2    159       174
# 10  TT-1         +   353   438     B2     85       259
# 11  TT-1         +   519   580     B2     61       320
# 12  TT-1         +   665   742     B2     77       397
# 13  TT-1         +   813   864     B2     51       448
# 14  TT-1         +   931   975     B2     44       492
# 15  TT-1         +  1053  1161     B2    108       600
# 16  BB-2         +     3   659     C3    656       656
# 17  BB-2         +     3   640     D4    637       637
# 18  BB-2         -  1093   426     E5    667       667
# 19  BB-2         -  1093   508     F6    585       585
# 20  EE-3         +     1    95     G7     94        94
# 21  EE-3         +   155   377     G7    222       316
# 22  EE-3         +   439   513     G7     74       390
# 23  EE-3         +   577   840     G7    263       653
# 24  EE-3         +     1    95     H8     94        94
# 25  EE-3         +   155   377     H8    222       316
# 26  EE-3         +   439   513     H8     74       390
# 27  EE-3         -   840   577     I9    263       263
# 28  EE-3         -   513   439     I9     74       337
# 29  EE-3         -   377   155     I9    222       559
# 30  EE-3         -   840   577    J10    263       263
# 31  EE-3         -   513   458    J10     55       318

共通の GENE と DIRECTION を持つ各グループについて、SUMRANGE が最大の行のインデックスを記録します。

idx = df.groupby(["GENE", "DIRECTION"])['SUMRANGE'].agg(lambda col: col.idxmax())
print(idx)
# GENE  DIRECTION
# BB-2  +            16
#       -            18
# EE-3  +            23
#       -            29
# TT-1  +             7
# Name: SUMRANGE

df列 GENE、DIRECTION、および SOURCE と で指定された行を含む のサブ DataFrame を選択しidxます。

dfm = df.ix[idx, ['GENE','DIRECTION','SOURCE']]
print(dfm)
#     GENE DIRECTION SOURCE
# 16  BB-2         +     C3
# 18  BB-2         -     E5
# 23  EE-3         +     G7
# 29  EE-3         -     I9
# 7   TT-1         +     A1

と で内部マージを実行dfdfmます。dfキーは、 andの共通の列、dfmつまり、GENE、DIRECTION、および SOURCE の共通部分です。「内部」マージでは、 と の両方が同じキーdfdfm共有する行のみが保持されます。したがって、マージされた結果の DataFrame では、dfの GENE、DIRECTION、および SOURCE は、 の GENE、DIRECTION、および SOURCE と一致する必要がありdfmます。したがって、間違った SOURCE を持つすべての行が削除されます。

result = pd.merge(df, dfm, how = 'inner')
print(result)
#     GENE DIRECTION  POS1  POS2 SOURCE  RANGE  SUMRANGE
# 0   TT-1         +     1    16     A1     15        15
# 1   TT-1         +   130   289     A1    159       174
# 2   TT-1         +   353   438     A1     85       259
# 3   TT-1         +   519   580     A1     61       320
# 4   TT-1         +   665   742     A1     77       397
# 5   TT-1         +   813   864     A1     51       448
# 6   TT-1         +   931   975     A1     44       492
# 7   TT-1         +  1053  1166     A1    113       605
# 8   BB-2         +     3   659     C3    656       656
# 9   BB-2         -  1093   426     E5    667       667
# 10  EE-3         +     1    95     G7     94        94
# 11  EE-3         +   155   377     G7    222       316
# 12  EE-3         +   439   513     G7     74       390
# 13  EE-3         +   577   840     G7    263       653
# 14  EE-3         -   840   577     I9    263       263
# 15  EE-3         -   513   439     I9     74       337
# 16  EE-3         -   377   155     I9    222       559
于 2013-02-27T22:51:24.820 に答える