Как использовать ast.literal_eval в кадре данных панд и обрабатывать исключения - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть dataframe со столбцом, содержащим данные tuple в виде строки. Например. '(5,6)'. Мне нужно преобразовать это в структуру кортежа. Один из способов сделать это - использовать ast.literal_eval (). Я использую это таким образом.

df['Column'] = df['Column'].apply(ast.literal_eval)

К сожалению, мои данные в этом столбце также содержат пустые строки. ast.literal_eval() не может справиться с этим. Я получаю эту ошибку.

SyntaxError: unexpected EOF while parsing

Я не уверен, так ли это, потому что он не может обработать такого персонажа. Основываясь на моем чтении, я обнаружил, что ast.literal_eval() работает только в тех случаях, когда внутри строковой структуры есть список, dict или кортеж.

Чтобы преодолеть это, я попытался создать свою собственную функцию и вернуть пустую строку, если она вызывает исключение.

def literal_return(val):
    try:
        return ast.literal_eval(val)
    except ValueError:
        return (val)

df['Column2'] = df['Column'].apply(literal_return)

Даже в этом случае появляется та же ошибка. Как мы справимся с этим. Было бы замечательно, даже если есть способ игнорировать определенные строки, чтобы применить функцию и применить к остальным. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Я бы сделал это просто, запрашивая строковый тип из каждой записи:

from ast import literal_eval
df['column_2'] = df.column_1.apply(lambda x: literal_eval(str(x)))
0 голосов
/ 08 сентября 2018

Работает при изменении функции на:

def literal_return(val):
    try:
        return ast.literal_eval(val)
    except (ValueError, SyntaxError) as e:
        return val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...