如何在 Pandas 数据框中使用 ast.literal_eval 并处理异常

Har*_*hna 8 python tuples pandas

我有一个dataframe包含tuple数据作为字符串的列。例如。'(5,6)'. 我需要将其转换为元组结构。一种方法是使用 ast.literal_eval()。我正在以这种方式使用它。

df['Column'] = df['Column'].apply(ast.literal_eval)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在此列中的数据也包含空字符串。这ast.literal_eval()是无法处理的。我收到这个错误。

SyntaxError: unexpected EOF while parsing

我不确定这是不是因为它无法处理这样的角色。根据我的阅读,我发现ast.literal_eval()只有在字符串结构中存在列表、字典或元组的情况下才有效。

为了克服这个问题,我尝试创建自己的函数并在引发异常时返回一个空字符串。

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

df['Column2'] = df['Column'].apply(literal_return)
Run Code Online (Sandbox Code Playgroud)

即使在这种情况下,也会弹出相同的错误。我们如何处理。即使有一种方法可以忽略某些行来应用该函数并应用于其余行,这也会很棒。任何帮助表示赞赏。

Art*_*sky 5

我会这样做,只需要每个条目的字符串类型:

from ast import literal_eval
df['column_2'] = df.column_1.apply(lambda x: literal_eval(str(x)))
Run Code Online (Sandbox Code Playgroud)

如果您需要高级异常处理,您可以这样做,例如:

def f(x):
    try:
        return literal_eval(str(x))   
    except Exception as e:
        print(e)
        return []

df['column_2'] = df.column_1.apply(lambda x: f(x))   
Run Code Online (Sandbox Code Playgroud)


Har*_*hna 3

当函数更改为:

def literal_return(val):
    try:
        return ast.literal_eval(val)
    except (ValueError, SyntaxError) as e:
        return val
Run Code Online (Sandbox Code Playgroud)