-2

次のような .txt があります (タブ区切り):

1 2345
1 2346
1 2347
1 2348
1 2412
1 2413
1 2414

最初の連続する 4 行には、2345 から 2348 までの連続する整数値が含まれます。同様に、最後の 3 行には、2412 から 2414 までの連続する値が含まれます。これらの連続する値のセットの最小値と最大値が 1 行に表示されるように、それらをグループ化したいと考えています。以下に示すように:

1 2345 2348
1 2412 2414

何か案が?

4

3 に答える 3

2

モジュールを使用してデータを読み書きしcsv、「次の」グループがいつ開始されるかを追跡します。

import csv

def grouped(reader):
    start = end = next(reader)
    print start, end
    for row in reader:
        if int(row[1]) - 1 != int(end[1]):
            yield (start, end)
            start = end = row
        else:
            end = row
    yield (start, end)

with open('inputfile.csv', 'rb') as inf, open('outputfile.csv', 'wb') as outf:
    inputcsv = csv.reader(inf, delimiter='\t')
    outputcsv = csv.writer(outf, delimiter='\t')
    for start, stop in grouped(inputcsv):
        outputcsv.writerow(start + stop[1:])

これは次のように書いています。

1   2345    2348
1   2412    2414

outputfile.csvあなたの入力のために。

このソリューションでは、メモリ内に 3 行を超えるデータが保持されることはないため、任意のサイズの CSV ファイルをスローできるはずです。

于 2013-03-19T16:44:50.727 に答える
0

numpy には、役立つツールがいくつか用意されています。

In [90]: import numpy as np

In [91]: x = np.loadtxt('seq.dat', dtype=int)

In [92]: x
Out[92]: 
array([[   1, 2345],
       [   1, 2346],
       [   1, 2347],
       [   1, 2348],
       [   1, 2412],
       [   1, 2413],
       [   1, 2414],
       [   1, 2500],
       [   1, 2501],
       [   1, 2502],
       [   2, 3000],
       [   2, 3001],
       [   2, 3100],
       [   2, 3101],
       [   2, 3102],
       [   2, 3103]])

In [93]: skip = np.where(np.diff(x[:,1]) != 1)[0]

In [94]: istart = np.hstack((0, skip + 1))

In [95]: istop = np.hstack((skip, -1))

In [96]: groups = np.hstack((x[istart], x[istop, 1:]))

In [97]: groups
Out[97]: 
array([[   1, 2345, 2348],
       [   1, 2412, 2414],
       [   1, 2500, 2502],
       [   2, 3000, 3001],
       [   2, 3100, 3103]])

データの最初の列はグループ化の際に無視されるため、最初の列がグループの形成方法に影響を与える可能性がある場合は、微調整が必​​要になります。

于 2013-03-19T18:40:46.820 に答える