如何从 Python 中的 csv 构建多类列表?
How to build a multiclass list from a csv in Python?
我正在尝试基于这样的数据框构建列表
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=";")
但是,如标题所述,我需要构建一个列表,将 class 列作为 object 而不是文本。我用这句话创建了列表:
newList = df.values.tolist()
newList
但是,结果不是预期的:
[['accepted', " {'APP': True , 'FEE': False, 'THY': False}"],
['change accepted', "{'APP': True , 'FEE': False, 'THY': False}"]]
可以看出,列表的第二个“列”被转换成了String。我需要的是这个(没有“):
[['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 文件,以及应该对数据帧进行哪些处理才能完成此任务?
您需要做的是将包含字典的字符串转换为字典,这可以使用 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}]]
我正在尝试基于这样的数据框构建列表
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=";")
但是,如标题所述,我需要构建一个列表,将 class 列作为 object 而不是文本。我用这句话创建了列表:
newList = df.values.tolist()
newList
但是,结果不是预期的:
[['accepted', " {'APP': True , 'FEE': False, 'THY': False}"],
['change accepted', "{'APP': True , 'FEE': False, 'THY': False}"]]
可以看出,列表的第二个“列”被转换成了String。我需要的是这个(没有“):
[['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 文件,以及应该对数据帧进行哪些处理才能完成此任务?
您需要做的是将包含字典的字符串转换为字典,这可以使用 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}]]