Python ast.literal_eval返回格式错误的字符串错误

时间:2019-07-16 04:34:56

标签: python pandas literals

我目前正在尝试使用ast.literal_eval方法将列表列表的字符串表示形式转换为列表列表。我尝试在此社区中查看以下问题:

  1. Malformed String ValueError ast.literal_eval() with String representation of Tuple
  2. python ast.literal_eval throwing malformed string error given “datetime.datetime.now()”

但是提供的解决方案和答案似乎不适用于我的情况。

我目前有一个形式如下(示例)的Pandas DataFrame:

industry     index     entities
cars         0         [ ['car1', 'it'], ['them', 'car2', 'car3'] ]
cars         1         [ ['car4', 'its'], ['car5', 'car6'] ]

当我使用pandas.read_csv加载CSV文件时,列entities中的条目是列表的字符串表示形式。我尝试使用ast.literal_eval将它们转换为列表,但是会发生以下情况:

df['entities'] = ast.literal_eval(df['entities'])


ValueError: malformed node or string: 0      [['car1', 'it'], ['them', 'car2', 'car3']]
1      [['car4', 'its'], ['car5', 'car6']]

我知道ast.literal_eval中使用的参数必须是Python文字结构,但是我传递的参数中的任何内容似乎都不是Python文字,因此似乎不是问题。

为了提供一些其他背景信息,我之前使用了相同的方法执行相同的操作,并且效果很好。但是,我最近修改了原始DataFrame,以删除单词“ the”的实例。

什么可能导致此错误?任何提示将不胜感激。谢谢。

修改

df.head(2).to_dict()返回以下内容。请注意,这与我提供的示例不同,因为这是我正在使用的原始DataFrame:

{'industry': {0: 'automotiveEngineering', 1: 'automotiveEngineering'},
 'index': {0: 0, 1: 1},
 'entities': {0: "[['Norway', 'it'], ['EQC—and', 'it', 'EQC', 'EQC'], ['Mercedes-Benz EQC Edition 1886 electric SUV', 'it', 'it', 'EQC400 4Matic crossover']]",
  1: '[[\'Ford Fusion\', \'Fusion\', \'Fusion\', \'Fusion\'], ["2013–2016 Ford Fusion sedans.automaker \'s", \'automaker\'], [\'Ford\', \'Ford\'], [\'faulty shifter cables that can cause rollaways\', \'these shifter cables , which can break off transmission due to a bad bushing at connection point\'], [\'these bushings\', \'them\']]'}}

我也尝试遍历每一行并分别修改每个实体,但是仍然会给我同样的错误。

我还要补充一点,当我在单行上运行ast.literal_eval时,它会返回适当的值而没有任何问题。

编辑2

通过运行,我设法实现了我想要做的事情:

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

但是不幸的是,这并不能回答我最初的问题,即可能导致字符串/节点格式错误的原因。

0 个答案:

没有答案