Заменить столбец во фрейме данных массивом numpy - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть pandas фрейм данных с формой 1725 строк X 4 столбцов.

      date     size           state type   
408      1    32000        Virginia  EDU
...

Мне нужно заменить столбец state на следующий массив numpy с формой (1725, 52 ).

[[0. 1. 0. ... 0. 0. 0.]
...
[0. 0. 1. ... 0. 0. 0.]] 

Окончательный результат должен быть таким:

      date     size                   state type   
408      1    32000 [0. 1. 0. ... 0. 0. 0.]  EDU
...

До сих пор я пробовал следующее на основе этого ответа :

col = 2
df.iloc[:, col] = np_arr.tolist()

Проблема в том, что я получаю эту ошибку:

    dataSet.iloc[:, col] = tempData.tolist()
  File "/home/marcus/.local/lib/python3.6/site-packages/pandas/core/indexing.py", line 205, in __setitem__
    self._setitem_with_indexer(indexer, value)
  File "/home/marcus/.local/lib/python3.6/site-packages/pandas/core/indexing.py", line 527, in _setitem_with_indexer
    "Must have equal len keys and value "
ValueError: Must have equal len keys and value when setting with an ndarray

1 Ответ

1 голос
/ 13 февраля 2020

Полагаю, вам нужно попробовать преобразовать массив в единое целое, прежде чем добавлять его в столбец. Эта проблема часто возникает при предварительной обработке. Попробуйте выполнить следующее:

df['state'] = np_arr.reshape(-1,1)

Если это не сработает, попробуйте сначала превратить его в массив, а затем в список:

df['state'] = np_arr.toarray().tolist()

Работа с несколькими столбцами: Вы можете попробовать выполнить эти замены в for l oop, используя либо list(df), который возвращает список всех имен столбцов, а затем обращаясь к ним по их значению индекса или iloc[]:

cols = list(df) #Get a list with all column names
column_positions = [0,2,4,5] #Here we will select columns in position 0,2,4 and 5
for i in column_positions: 
    df[cols[i]] = np_arr.tolist() #Iterate over those specific columns and replace their values.
...