我目前正在尝试使用ast.literal_eval
方法将列表列表的字符串表示形式转换为列表列表。我尝试在此社区中查看以下问题:
但是提供的解决方案和答案似乎不适用于我的情况。
我目前有一个形式如下(示例)的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)
但是不幸的是,这并不能回答我最初的问题,即可能导致字符串/节点格式错误的原因。