Как создать многоклассовый список из csv в Python?

#python #list #dataframe #classification #multiclass-classification

#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=";")
 

Но, как указано в названии, мне нужно создать список, который принимает столбец класса как объект, а не как текст. Я создал список, используя это предложение:

 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, а также какая обработка должна выполняться над фреймом данных для достижения этой задачи?

Ответ №1:

Что вам нужно сделать, это преобразовать строку, содержащую словарь, в словарь, и это можно сделать с помощью ast.literal_eval() .

При понимании списка data_ вы перебираете массив, затем используете ast.literal_eval 2-й индекс, который является строкой "{'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}]]