1

我正在尝试基于这样的数据框构建一个列表

TRAINING_DATA = [
   ["accepted",{"APP": True , "FEE": False, "THY": False}],
   ["change accepted",{"APP": True , "FEE": False, "THY": False}],
   ["yes i approve these changes",{"APP": True , "FEE": False, "THY": False}]
]

从 Jupyter 我可以毫无问题地创建它。但是,我需要从 csv 文件构建它。目前,我正在尝试使用以下内容:

text;class
"accepted"; {'APP': True , 'FEE': False, 'THY': False}
"change accepted";{'APP': True , 'FEE': False, 'THY': False}

而且,在 Python 中,我使用以下命令加载文件:

df = pd.read_csv("prueba.csv", usecols=['text','class'], delimiter=";")

但是,如标题中所述,我需要构建一个将类列作为对象而不是文本的列表。我使用这句话创建了列表:

newList = df.values.tolist()
newList

但是,结果不是预期的:

[['accepted', " {'APP': True , 'FEE': False, 'THY': False}"],
['change accepted', "{'APP': True , 'FEE': False, 'THY': False}"]]

可以看出,列表的第二个“列”被转换为字符串。我需要的是这个(没有“):

[['accepted', {'APP': True , 'FEE': False, 'THY': False}],
['change accepted', {'APP': True , 'FEE': False, 'THY': False}]]

重要的是要提到我已经执行了以下句子:

df['class'] = df['class'].astype(object)
df['class'] = df['class'].astype('category')

但没有任何成功。

我需要知道的是应该如何编写 csv 文件,以及为了完成这项任务,应该对数据帧进行什么处理?

4

1 回答 1

1

您需要做的是将包含字典的字符串转换为字典,这可以使用ast.literal_eval().

在列表理解中data_,您循环遍历数组,然后ast.literal_eval在第二个索引上使用字符串,"{'APP': True , 'FEE': False, 'THY': False}"然后将其转换为字典。之后创建一个新数组并将第一个元素(即字符串)accepted放在第一位,然后将新字典放在第二个位置。

注意: 这仅在包含字典的字符串中没有不必要的空格时才有效。因此,请确保删除此字符串前面的空格" {'APP': True , 'FEE': False, 'THY': False}"并将其更改为原来的"{'APP': True , 'FEE': False, 'THY': False}"样子。

import ast

data = [
    ["accepted", "{'APP': True , 'FEE': False, 'THY': False}"],
    ["change accepted", "{'APP': True , 'FEE': False, 'THY': False}"],
]

data_ = [[d[0], ast.literal_eval(d[1])] for d in data]
print(data_)

输出:

[['accepted', {'APP': True, 'FEE': False, 'THY': False}], ['change accepted', {'APP': True, 'FEE': False, 'THY': False}]]
于 2021-02-04T04:41:55.233 回答