Ошибки при преобразовании числового кадра данных в целое в пандах только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс

У меня большой набор данных, и я пытаюсь преобразовать столбцы «объект», содержащие только числовые данные, в «целочисленный» тип данных в python/pandas. С каждым кодом, который я пытался, я получил следующую ошибку:

CODE SNIPPET (see below for options I have tried)
PATH/frame.py in __setiten__(self, key, value)
     3482              self._setitem_frame(key, value)
     3483         elif isinstance(key, (Series, np.ndarray, list, Index)):
  -->3484              self._setiten_array(key, value)
     3485         else: 

PATH/frame.py in _setitem_array(self, key, value)
     3507                  raise ValueError("Columns must be same length as key")
     3508              for k1, k2 in zip(key, value.columns):
  -->3509                  self[k1] = value[k2]
     3510           else: 
     3511              indexer = self.loc._convert_to_indexer(key, axis=1)
    
PATH/frame.py in __setitem__(self, key, value)
     3485         else: 
     3486             #set column
  -->3487             self._set_item(key, value)
     3488
     3489    def _setitem_slice(self, key, value):

PATH/frame.py in _set_item(self, key, value)
     3562
     3563     self._ensure_valid_index(value)
  -->3564     value = self._sanitize_column(key, value)
     3565     NDFrame._set_item(self, key, value)

PATH/frame.py in _sanitize_column(self, key, value, broadcast)
     3778     if broadcast and key in self.columns and value.ndim == 1: 
     3780         if not self.columns.is_unique or isinstance(self.columns, MultiIndex):
  -->3781             existing_piece = self[key]
     3782             if isinstance(existing_piece, DataFrame):
     3783                 value = np.tile(value, (len(existing_piece.columns), 1))

PATH/frame.py in __getitem__(self, key)
     2971     if self.columns.nlevels > 1:
     2972          return self.getitem_multilevel(key)
  -->2973     return self.__get_item_cache(key_
     2974
     2975     # Do we have a slicer (on rows)?

PATH/generic.py in _get_item_cache(self, item)
     3268    res = cache.get(item)
     3269    if res is None:
  -->3270         values = self.data.get(item)
     3271         res = self.box_item_values(item, values)
     3272         cache[item] = res

PATH/managers.py in get(self, item)
     958                      raise ValueError("cannot label index with a null key")
     959      
  -->960                return self.iget(loc)
     961          else:
     962
    
PATH/managers.py in iget(self, i)
     975     Otherwise return as a ndarray
     976     """
  -->977     block = self.blocks[self.blknos[i]]
     978     values = block.iget(self._blklocks[i])
     978     if values.ndi != 1:

    TypeError: only integer scalar arrays can be concerted to a scalar index

Что я пробовал, и все это вернуло (выше) ошибку:

df[["column1", "column 2", "column 3", "column 4"]] = df[["column 1", "column 2", "column 3", "column 4"]].apply(pd.to_numeric, errors='raise')

А ТАКЖЕ

df[["column1", "column 2", "column 3", "column 4"]] = df[["column 1", "column 2", "column 3", "column 4"]].apply(pd.to_numeric, errors='raise')

ГДЕ, df = имя фрейма данных в python; столбец 1 и т. д. = имена столбцов в python

Я также пробовал:

df["column1"] = df["column1"].astype(str).astype(int)

А ТАКЖЕ

df["column1"] = pd.numeric(df["column1"], errors = 'coerce')

который также вернул ту же ошибку. ДОПОЛНИТЕЛЬНЫЕ Попытки после первого поста: я также пробовал--

def convert_numbers(val):
    """
    Convert number string to integer
    """
    new_val = val
    return int(new_val)

df["column1"].apply(convert_numbers)

который снова вернул ту же ошибку.

Я дважды проверил типы данных. df.dtypes показывает типы данных для столбцов, которые я пытаюсь изменить как объект, независимо от того, что я делаю. Я дважды проверил код, и для рассматриваемых столбцов нет отсутствующих/нулевых значений. Я также проверил форматирование, и столбцы полностью числовые. Один столбец отформатирован тремя числами (т. е. 207, 710, 115), другой — двумя числами (01, 02, 03), а последний — пятью числами (00001, 00002, 00003)....

Любая помощь в этом будет оценена по достоинству. Если я найду ответ, я опубликую его здесь.


person Maggie    schedule 29.06.2020    source источник


Ответы (2)


Попробуй это:

for col in ["column1", "column 2", "column 3", "column 4"]:
    # df[col].reshape((1,-1))
    df[col] = [int(n) for n in df[col]]
person Ann Zen    schedule 29.06.2020
comment
спасибо! Я попробовал это, однако я получил тот же ответ. :( - person Maggie; 29.06.2020
comment
Попробуйте добавить df[col].reshape((1, -1)) - person Ann Zen; 29.06.2020
comment
Я пробовал, поэтому мой код выглядит так: for col in ["column1", "column 2", "column 3", "column 4"]: df[col] = [int(n) for n in df[col]] df[col].reshape((1,-1)) и получил ту же ошибку. - person Maggie; 29.06.2020
comment
^^ отступ отключен, я все еще учусь, как правильно помещать код в комментарии здесь. - person Maggie; 29.06.2020

Я нашел ответ. Проблема может заключаться в том, что я работаю с подключением к базе данных Oracle, я не уверен. Я все еще хотел бы услышать больше комментариев, если у кого-то есть более простой способ сделать это в Python, но вот как я это сделал:

#coerce stores all non-convertible values as NA and ignore keeps original values, so column may have mixed data types. 
df['column names'] = df[['column names']].apply(pd.to_numeric, errors = 'coerce').fillna(df)

Помните, что использование принуждения с нечисловыми элементами может привести к удалению их данных и переключению их на NA. :) Это сработало!

person Maggie    schedule 02.07.2020