#python #pandas #dataframe #csv
#python #pandas #фрейм данных #csv
Вопрос:
У меня есть набор данных, который я преобразовал в CSV в качестве потенциальных входных данных для автоматического кодирования keras. Загрузка CSV работает безупречно с pandas.read_csv()
, но типы данных неверны.
CSV содержит только два столбца: label и features, тогда как столбец label содержит строки, а массивы столбцов features — целые числа со знаком ([-1, 1]). Итак, в целом довольно простая структура.
Чтобы получить два разных фрейма данных для дальнейшей обработки, я создал их через:
labels = pd.DataFrame(columns=['label'], data=csv_data, dtype='U')
и
features = pd.DataFrame(columns=['features'], data=csv_data)
в обоих случаях я получил неправильные типы данных, поскольку оба помечены как object
типизированные фреймы данных. Что я делаю не так? Что касается функций, это еще сложнее, потому что синтаксический анализ возвращает мне a, pandas.sequence
который содержит массив в виде строки: ['[1, ..., 1]']
.
Итак, я попробовал утомительный обходной путь, проанализировав строку обратно в массив numpy с помощью .to_numpy()
приведения python для каждого элемента, а затем np.assarray()
— но тип фрейма данных по-прежнему неверен. Я думаю, что это не может быть общим подходом к решению этой задачи. Поскольку я довольно новичок в pandas, я проверил некоторые руководства и API, но в большинстве случаев ячейка во фрейме данных скорее содержит единственное значение вместо полного массива. Возможно, мой общий дизайн фрейма данных просто не подходит для этой задачи.
Получена любая помощь!
Комментарии:
1. Есть ли у вас нулевые значения в функциях? Также, если возможно, пожалуйста, предоставьте образец CSV-данных
2. у меня есть нули, но не нулевые значения в строке csv, которая выглядит следующим образом: a_b,[1,-1,0,1,..,0,-1] где 0, 1 и -1 — мои единственные значения в массиве
3.Итак, это точное представление ваших данных?
featurea [1,0,1,1,1,1,]
featureb [1,0,1,1,1,1,]
featurec [1,0,1,1,1,1,]
featured [1,0,1,1,1,1,]
featuree [1,0,1,1,1,1,]
4. абсолютно! очень простая структура без дополнительных свойств.
Ответ №1:
Вы читаете файл как строку, но у вас есть список python в виде столбца, вам нужно оценить его, чтобы получить список. Я не уверен в варианте использования, но вы можете разделить метки для более читаемого фрейма данных
import pandas as pd
features = ["featurea","featureb","featurec","featured","featuree"]
labels = ["[1,0,1,1,1,1]","[1,0,1,1,1,1]","[1,0,1,1,1,1]","[1,0,1,1,1,1]","[1,0,1,1,1,1]"]
df = pd.DataFrame(list(zip(features, labels)),
columns =['Features', 'Labels'])
import ast
#convert Strings to lists
df['Labels'] = df['Labels'].map(ast.literal_eval)
df.index = df['Features']
#Since list itself might not be useful you can split and expand it to multiple columns
new_df = pd.DataFrame(df['Labels'].values.tolist(),index= df.index)
Вывод
0 1 2 3 4 5
Features
featurea 1 0 1 1 1 1
featureb 1 0 1 1 1 1
featurec 1 0 1 1 1 1
featured 1 0 1 1 1 1
featuree 1 0 1 1 1 1
Комментарии:
1. Спасибо за ответ, я попробовал ваши решения, и это намного элегантнее, чем предыдущая процедура. Я заметил всего несколько вещей: 1. literal_eval не работает для схемы 1_3_3, поскольку она оценивает ее как 133, но это не реальная проблема 2. новая функция dataframe имеет форму 15,1, которая указывает на 15 строк с одной записью в каждой — поэтому рекомендованное вами расширение не работает должным образом. Возможно, это та же проблема, что и запись, которая обрабатывается как строка, но я уже изучаю это.
2. Спасибо, что указали расширение столбцов — я повторно проанализировал свой csv до строк с помощью: labelA, 1, -1, 0 …, 1, 2 — и пропущены соответствующие заголовки — теперь он работает с отступом единственным недостатком является то, что я теперь работаю с индексами вместо столбцов, но это не настоящий минус
Ответ №2:
Входной csv был неправильно отформатирован, поэтому синтаксический анализ был точным, но не таким, как я предполагал. Я расширил реальные столбцы и пропустил заголовок, чтобы иметь столбец для каждой записи массива — теперь panda распознает типы и правильные размеры.