проблемы с reg: TypeError: ожидаемая строка или байтовоподобный объект - PullRequest
0 голосов
/ 14 марта 2020

Я пробую код:

`s='{"mail":vip@a.com,"type":"a","r_id":"1312","level":307},{"mail":vipx@a.com,"type":"b","r_id":"1111"}'`
data_raw=re.split(r'[\{\}]',s)
data_raw=data_raw[1::2]
data=pd.DataFrame(data_raw)
data[0]=str(data[0])
data['r_id']=data[0].apply(lambda x:re.search(r'(r_id)',data[0]))
data['level']=data[0].apply(lambda x:re.search(r'(level)',data[0]))
print(data)

Я sh Я мог бы получить результат:

Уровень__

1312 307

1111 NAN

Но он показывает ошибку: ожидаемая строка или байтовоподобный объект. Так как я могу использовать re.search в pandas или как получить результат?

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

ниже работает для меня. Проблема с типом возникает потому, что вы не можете изменить тип всех строк таким образом. Для этого вам также потребуется лямбда-функтор.

Существует дополнительная проблема, заключающаяся в том, что регулярное выражение и обработка исключений не будут работать так. Я предложил решение для этого, но вы можете рассмотреть другое регулярное выражение, если вы хотите, чтобы это работало для других столбцов. Я очень новичок в области регулярных выражений, так что может быть более универсальное решение для вашей проблемы.

import re
import pandas as pd
import numpy as np

s='{"mail":vip@a.com,"type":"a","r_id":"1312","level":307},{"mail":vipx@a.com,"type":"b","r_id":"1111"}'
data_raw=re.split(r'[\{\}]',s)
data_raw=data_raw[1::2]
data=pd.DataFrame(data_raw)



# This is a regex wrapper which gets the row of our pandas dataframes and the columns that we want.
def regex_wrapper(row,column):
    match = re.search(r'"' + column + '":"?(\d+)"?', str(row))
    if match:
        return match.group(1)
    else:
        return np.nan


data['r_id'] = data[0].apply(lambda row: regex_wrapper(row,"r_id"))
data['level'] = data[0].apply(lambda row: regex_wrapper(row,"level"))
del data[0]
0 голосов
/ 14 марта 2020

Мои два цента ...

import re

pattern = re.compile(r'^.*?id\":\"(\d+)\",\"level\":(\d+).*id\":\"(\d+).*$')

string = r'{"mail":vip@a.com,"type":"a","r_id":"1312","level":307},{"mail":vipx@a.com,"type":"b","r_id":"1111"}'

data = pattern.findall(string)

data

, который возвращает массив:

[('1312', '307', '1111')]

И вы можете получить доступ к элементам, например:

data[0][2]

Regex demo: https://regex101.com/r/Inv4gp/1

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