Python. Получить непрерывную длину сегментов вдоль строк для каждого столбца - PullRequest
2 голосов
/ 24 марта 2020

У меня есть файл, подобный этому, с сегментами 0, 1 и 2:

0000000001111100110002220000000011111111
0011100000111000000220111110001111100000
1110011111111111000001111000002222111000
0011110001110000000220220000001111100000

Например, строка 1 имеет сегмент 9 0, за которым следует сегмент 5 1, а затем отрезком 2 0 и т. д. В этом игрушечном примере каждая строка переходит от позиции 0 до 39 (Python), но в действительности она переходит от 0 до> 2000000, а количество строк> 10000. Для каждого столбца я хотел бы получить длину непрерывных сегментов 0, 1 и 2. Например, для:

column 0, level 0, I have: 9, 2, 0 and 2. 
column 0, level 1, I have: 0, 0, 3 and 0. 
column 0, level 2, I have: 0, 0, 0 and 0. 

For column 10, level 0: 0,5,0 and 0
For column 10, level 1: 5,0,11 and 3
For column 10, level 2: 0,0,0 and 0

For column 23, level 0: 0,0,0 and 0
For column 23, level 1: 0,5,4 and 0
For column 23, level 2: 3,0,0 and 2

В конце я хотел бы иметь 3 разных матрицы (для уровней 0,1 и 2) с длиной сегментов для каждого столбца.

Для 0 это будет выглядеть примерно так:

9.........0............0.................
2.........0............0.................
0.........0............0.................
2.........0............0.................

Для 1:

0.........5............0.................
0.........3............0.................
3.........11............0.................
0.........3............0.................

Для 2:

0.........0............3.................
0.........0............0.................
2.........0............0.................
0.........0............2.................

Как сделать это с Python numpy или pandas?

1 Ответ

1 голос
/ 25 марта 2020

Предполагая, что вы можете прочитать файл в список строк (используя, например, readlines), вы можете создать фрейм данных из набора (level, count), используя itertools.groupby, а затем выполнить итерацию по ним, чтобы получить желаемый результат, здесь идет:

import itertools
import pandas as pd
import numpy as np

l = \
["0000000001111100110002220000000011111111",
"0011100000111000000220111110001111100000",
"1110011111111111000001111000002222111000",
"0011110001110000000220220000001111100000"]

def level_and_count(row):
    g1 = [(x[0], len(list(x[1]))) for x in itertools.groupby(row)]
    return sum([[x]*x[1] for x in g1], [])

df = pd.DataFrame([level_and_count(row) for row in l])

def mat_by_level(df, level):
    aa = df.apply(lambda c: [x[1] if x[0]==level else 0 for x in c],   axis=1)
    return pd.DataFrame(np.vstack(aa))

и теперь, когда у нас есть функции, мы можем запустить их на каждом уровне и сохранить результат в файл (в этом примере через запятую):

for level in ['0', '1', '2']:
    mat_by_level(df, level).to_csv(f'level_{level}.csv', index=False, header=False) 

дай мне знать, если ты это имел в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...