фильтрация значений df в кавычках - PullRequest
0 голосов
/ 19 ноября 2018

Я генерирую df из результата командной строки с кодом как показано ниже: -

df_output_lines = [s.split() for s in os.popen("my command linecode").read().splitlines()]
df_output_lines  = list(filter(None, df_output_lines))

и преобразование его в формат данных: -

df=pd.DataFrame(df_output_lines)
df

данные в следующем формате: -

abc = pd.DataFrame([['time:"08:59:38.000"', 'instance:"(null)"','id:"3214039276626790405"'],['time:"08:59:38.000"', 'instance:"(Ops-MacBook-Pro.local)"','id:"3214039276626790405"'],['time:"08:59:38.000"', 'instance:"(Ops-MacBook-Pro.local)"','id:"3214039276626790405"']])
abc

enter image description here

Я хочу отфильтровать его таким образом, чтобы значение before : было именем столбца, а значения в quotes " " - значением, и то же самое относится ко всем столбцам. Результат должен быть таким: enter image description here

На данный момент я делаю это трудным путем: -

abc.rename(columns={0:'time',1:'instance',2:'id'},inplace=True)

, а затем

abc['time'] = abc['time'].map(lambda x: str(x)[:-1])
abc['time'] = abc['time'].map(lambda x: str(x)[6:])

abc['instance'] = abc['instance'].map(lambda x: str(x)[:-1])
abc['instance'] = abc['instance'].map(lambda x: str(x)[10:])

abc['id'] = abc.id.str.extract('(\d+)', expand=True).astype(int)

Любое предложение для лямбда-выражения или любой другой лайнер, чтобы сделать это.

Мой вывод для необработанного журнала выглядит следующим образом: -

    time:"11:22:20.000" instance:"(null)" id:"723927731576482920" channel:"sip:confctl.com" type:"control" elapsedtime:"0.000631" level:"info" operation:"Init" message:"Initialize (version 4.9.0002.30618) ... "

    time:"11:22:21.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl.com" type:"control" elapsedtime:"0.067122" level:"info" operation:"Connect" message:"Connecting to https://hrpd.www.vivox.com/api2/"

    time:"11:22:23.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl-.com" type:"control" elapsedtime:"2.685700" level:"info" operation:"Connect" message:"Connected to https://hrpd.www.vivox.com/api2/"

    time:"11:22:23.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl-.com" type:"control" elapsedtime:"2.814268" level:"info" operation:"Login" message:"Logged in .tester_food."

    time:"11:22:23.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl-.com" type:"control" elapsedtime:"2.912255" level:"error" operation:"Call" message:".tester_food. failed to join sip:confctl-2@hrpd.vivox.com error:Access token has invalid signature(403)"

 time:"12:30:41.000" instance:"Ops-MacBook-Pro.local" id:"10316899144153251411" channel:"sip:confctl-2@hrpd.vivox.com" type:"media" sampleperiod:"0.000000" incomingpktsreceived:"0" incomingpktsexpected:"0" incomingpktsloss:"0" incomingpktssoutoftime:"0" incomingpktsdiscarded:"0" outgoingpktssent:"0" predictedmos:"3" latencypktssent:"0" latencycount:"0" latencysum:"0.000000" latencymin:"0.000000" latencymax:"0.000000" callid:"2477580077" r_factor:"0.000000"

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Несмотря на то, что ответ уже получен, Тем не менее, хотелось бы добавить базовый подход регулярных выражений для достижения того же:

>>> abc
                  time                            instance                        id
0  time:"08:59:38.000"                   instance:"(null)"  id:"3214039276626790405"
1  time:"08:59:38.000"  instance:"(Ops-MacBook-Pro.local)"  id:"3214039276626790405"
2  time:"08:59:38.000"  instance:"(Ops-MacBook-Pro.local)"  id:"3214039276626790405"

Просто применить regex=True в DataFrame.

>>> abc.replace('instance:|id:|time:|\"|[()]', '',regex=True)
           time               instance                   id
0  08:59:38.000                   null  3214039276626790405
1  08:59:38.000  Ops-MacBook-Pro.local  3214039276626790405
2  08:59:38.000  Ops-MacBook-Pro.local  3214039276626790405

OR   

# abc.replace('(instance:|id:|time:)|\"|[()]', '',regex=True)

объяснение регулярного выражения:

  • 1-й Альтернативный экземпляр: экземпляр: соответствует символам экземпляр: буквально (с учетом регистра)

  • 2nd Альтернативный идентификатор: id: соответствует идентификатору символов: буквально (с учетом регистра)

  • 3-й Альтернативное время: время: соответствует времени символа: буквально (с учетом регистра)

  • 4-й вариант \ "буквально соответствует символу" (с учетом регистра)

  • 5-й вариант [()] 'Соответствует одному символу, присутствующему вСписок ниже [()] () соответствует одному символу в списке () (с учетом регистра)

0 голосов
/ 19 ноября 2018

Учитывая ваш пример ввода:

time:"11:22:20.000" instance:"(null)" id:"723927731576482920" channel:"sip:confctl.com" type:"control" elapsedtime:"0.000631" level:"info" operation:"Init" message:"Initialize (version 4.9.0002.30618) ... "

time:"11:22:21.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl.com" type:"control" elapsedtime:"0.067122" level:"info" operation:"Connect" message:"Connecting to https://hrpd.www.vivox.com/api2/"

time:"11:22:23.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl-.com" type:"control" elapsedtime:"2.685700" level:"info" operation:"Connect" message:"Connected to https://hrpd.www.vivox.com/api2/"

time:"11:22:23.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl-.com" type:"control" elapsedtime:"2.814268" level:"info" operation:"Login" message:"Logged in .tester_food."

time:"11:22:23.000" instance:"Ops-MacBook-Pro.local" id:"723927731576482920" channel:"sip:confctl-.com" type:"control" elapsedtime:"2.912255" level:"error" operation:"Call" message:".tester_food. failed to join sip:confctl-2@hrpd.vivox.com error:Access token has invalid signature(403)"

Исходя из вашей команды os.popen, мы отфильтровываем пустые строки и пытаемся shlex.split строку сохранить, чтобы в пробелах были сохранены пробелы (но сами кавычки удалены), например:

import os
import shlex
import pandas as pd

rows = [shlex.split(line) for line in os.popen("my command linecode").read().splitlines() if line.strip()]

Это даст вам, например, rows[0] из:

['time:11:22:20.000',
 'instance:(null)',
 'id:723927731576482920',
 'channel:sip:confctl.com',
 'type:control',
 'elapsedtime:0.000631',
 'level:info',
 'operation:Init',
 'message:Initialize (version 4.9.0002.30618) ... ']

Затем вы разделяете их на :, чтобы отделить идентификатор от значения, и передаете его в pd.DataFrame, например:

df = pd.DataFrame(dict(col.partition(':')[::2] for col in row) for row in rows)

Дает вам df из:

            channel elapsedtime                  id               instance  level                                            message operation          time     type
0   sip:confctl.com    0.000631  723927731576482920                 (null)   info           Initialize (version 4.9.0002.30618) ...       Init  11:22:20.000  control
1   sip:confctl.com    0.067122  723927731576482920  Ops-MacBook-Pro.local   info     Connecting to https://hrpd.www.vivox.com/api2/   Connect  11:22:21.000  control
2  sip:confctl-.com    2.685700  723927731576482920  Ops-MacBook-Pro.local   info      Connected to https://hrpd.www.vivox.com/api2/   Connect  11:22:23.000  control
3  sip:confctl-.com    2.814268  723927731576482920  Ops-MacBook-Pro.local   info                            Logged in .tester_food.     Login  11:22:23.000  control
4  sip:confctl-.com    2.912255  723927731576482920  Ops-MacBook-Pro.local  error  .tester_food. failed to join sip:confctl-2@hrp...      Call  11:22:23.000  control
0 голосов
/ 19 ноября 2018

Фид списка словарей на pd.DataFrame

Конструктор pd.DataFrame принимает список словарей напрямую. Вы можете использовать str.rstrip и str.split в пределах списка:

res = pd.DataFrame([dict(i.rstrip('"').split(':"') for i in row) for row in abc.values])

print(res)

                    id                 instance          time
0  3214039276626790405                   (null)  08:59:38.000
1  3214039276626790405  (Ops-MacBook-Pro.local)  08:59:38.000
2  3214039276626790405  (Ops-MacBook-Pro.local)  08:59:38.000

Неясно, какую логику вы используете для определения только 'null' строк, заключенных в скобки.

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