AttributeError: у объекта 'Series' нет атрибута 'label'

Я пытаюсь следовать руководству по классификации звука в нейронных сетях, и я нашел 3 разные версии одного и того же учебника, и все они работают, но все они достигают загвоздки в коде, где я получаю "AttributeError: у объекта" Series "нет атрибута" label "". Я не особо знаком с NN или Python, поэтому извиняюсь, если это что-то тривиальное, как ошибка устаревания, но я не могу понять это сам.

def parser(row):
   # function to load files and extract features
   file_name = os.path.join(os.path.abspath(data_dir), 'Train/train', str(row.ID) + '.wav')

   # handle exception to check if there isn't a file which is corrupted
   try:
      # here kaiser_fast is a technique used for faster extraction
      X, sample_rate = librosa.load(file_name, res_type='kaiser_fast') 
      # we extract mfcc feature from data
      mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T,axis=0) 
   except Exception as e:
      print("Error encountered while parsing file: ", file)
      return None, None
 
   feature = mfccs
   label = row.Class
 
   return [feature, label]

temp = train.apply(parser, axis=1)
temp.columns = ['feature', 'label']

from sklearn.preprocessing import LabelEncoder

X = np.array(temp.feature.tolist())
y = np.array(temp.label.tolist())

lb = LabelEncoder()

y = np_utils.to_categorical(lb.fit_transform(y))

Как уже упоминалось, я видел три разных урока на одну и ту же тему, каждый из которых заканчивается одинаковым фрагментом "temp = train.apply(parser, axis=1) temp.columns = ['feature', 'label']", так что я предполагаю, что это назначает правильно, но я не знаю, где это происходит иначе. Помощь оценена!

Редактировать: трассировка по запросу, оказывается, я добавил неправильный трассировку. Кроме того, с тех пор я узнал, что это случай преобразования объекта серии в фрейм данных, поэтому любая помощь с этим была бы полезной.

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-17-1613f53e2d98> in <module>()
  1 from sklearn.preprocessing import LabelEncoder
  2 
----> 3 X = np.array(temp.feature.tolist())
  4 y = np.array(temp.label.tolist())
  5 

/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in __getattr__(self, name)
   4370             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   4371                 return self[name]
-> 4372             return object.__getattribute__(self, name)
   4373 
   4374     def __setattr__(self, name, value):

AttributeError: 'Series' object has no attribute 'feature'

1 ответ

Решение

Ваша текущая реализация parser(row) Метод возвращает список для каждой строки данных из train DataFrame. Но затем он собирается как объект pandas.Series.

Так что ваши temp на самом деле Series объект. Тогда следующая строка не имеет никакого эффекта:

temp.columns = ['feature', 'label']

поскольку temp это Series, он не имеет никаких столбцов, и, следовательно, temp.feature а также temp.label не существует и, следовательно, ошибка.

Измени свой parser() метод следующим образом:

def parser(row):
    ...
    ...
    ...

    # Return pandas.Series instead of List
    return pd.Series([feature, label])

Делая это, применить метод из temp = train.apply(parser, axis=1) вернет DataFrame, так что ваш другой код будет работать.

Я не могу сказать об уроках, которые вы читаете. Возможно они следовали за более старой версией панд, которая позволяла автоматически преобразовывать список в DataFrame,

Другие вопросы по тегам