Загрузка CSV с помощью Pandas — массив неправильно проанализирован

#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 распознает типы и правильные размеры.