Регулярное преобразование текста в панду - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть текстовый файл, который содержит несколько строк в следующем формате:

real    0m0.020s
user    0m0.000s
sys 0m0.000s
Round  1  completed. with matrix size of  1200 x 1200 with threads 8

real    0m0.022s
user    0m0.000s
sys 0m0.001s
Round  2  completed. with matrix size of  1200 x 1200 with threads 8

Существует около 500 записей такого рода (выше пример 2). Кажется, я не могу понять, как поместить их в кадр данных панд, который может выглядеть примерно так:

Matrix Size    Threads    Round    Real    User    Sys
1200 x 1200    8          1        0.0020  0.0000  0.0000
1200 x 1200    8          2        0.0022  0.0000  0.0001

Есть ли способ с помощью регулярных выражений или каким-либо другим способом преобразовать выходные данные теста в кадр данных. Кроме того, я не знаю, правильно ли я интерпретировал время, так как они в 0 м (я думаю, 0 минут) и 0,02 (я думаю, 0,02 секунды)

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Вы можете использовать регулярное выражение:

import re
import pandas as pd

regex = re.compile(r'real +(\dm\d\.\d+s)\nuser +(\dm\d\.\d+s)\nsys +(\dm\d\.\d+s)\nRound +(\d+).+of +(\d+ x \d+).+threads (\d+)')

df = pd.DataFrame(regex.findall(data), columns=['real', 'user', 'sys', 'round', 'matrix size', 'threads'])

print(df)

Выход:

       real      user       sys round  matrix size threads
0  0m0.020s  0m0.000s  0m0.000s     1  1200 x 1200       8
1  0m0.022s  0m0.000s  0m0.001s     2  1200 x 1200       8
1 голос
/ 25 апреля 2019

Если вы хотите решить проблему, используя только pandas, вы можете использовать str.split():

# data
s = """real    0m0.020s
user    0m0.000s
sys 0m0.000s
Round  1  completed. with matrix size of  1200 x 1200 with threads 8

real    0m0.022s
user    0m0.000s
sys 0m0.001s
Round  2  completed. with matrix size of  1200 x 1200 with threads 8"""

# str.split on two line breaks for rows then split on the text
df = pd.DataFrame(s.split('\n\n'))[0].str.split('   |real | with |user    |sys |matrix size of  |threads |\n')\
                                  .apply(lambda x: [s for s in x if s]).apply(pd.Series)

# split col 3 on round and completed to get number of rounds
df[3] = df[3].str.strip('Round | completed.')

# rename columns
df.columns = ['real', 'user', 'sys', 'round', 'matrix size', 'threads']

out

       real      user       sys round  matrix size threads
0  0m0.020s  0m0.000s  0m0.000s     1  1200 x 1200       8
1  0m0.022s  0m0.000s  0m0.001s     2  1200 x 1200       8

обратите внимание, что это будет более медленный пример gmds:

1000 loops, best of 3: 4.42 ms per loop против 1000 loops, best of 3: 1.84 ms per loop

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