#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}]]