Не удается передать список из фрейма данных в массив numpy с помощью python-pandas

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

Для фрейма данных df :

 name       list1                    list2
a          [1, 3, 10, 12, 20..]     [2, 6, 23, 29...]
b          [2, 10, 14, 3]           [4, 7, 8, 13...]
c          []                       [98, 101, 200]
...
  

Я хочу передать list1 и list2 np.array , а затем hstack их. Вот что я сделал:

 df.pv = df.apply(lambda row: np.hstack((np.asarray(row.list1), np.asarray(row.list2))), axis=1)
  

И я получил такую ошибку:

 ValueError: Shape of passed values is (138493, 175), indices imply (138493, 4)
  

Где 138493==len(df)

Обратите внимание, что некоторое значение в list1 и list2 является пустым списком, [] . И длина списка различаются между строками. Знаете ли вы, в чем причина, как я могу решить проблему? Заранее спасибо!

Редактировать:

Когда я просто пытаюсь преобразовать один список в массив:

 df.apply(lambda row: np.asarray(row.list1), axis=1)
  

Также возникает ошибка:

 ValueError: Empty data passed with indices specified.
  

Комментарии:

1. можете ли вы предоставить воспроизводимый ввод?

2. @ColonelBeauvel Спасибо за ваш ответ! Разве приведенный выше пример не воспроизводим?

3. @user5779223 Как вы создали свой фрейм данных, вот что он имел в виду

4. @MMF я читаю в наборе данных и преобразую его в форму, подобную этой. Действительно, я все еще не знаю, какая информация вам нужна?

5. поделитесь с нами кодом, в котором вы создаете df . df = ?

Ответ №1:

Ваша функция apply почти верна. Все, что вам нужно сделать — преобразовать выходные np.hstack() данные функции обратно в список python.

 df.apply(lambda row: list(np.hstack((np.asarray(row.list1), np.asarray(row.list2)))), axis=1)
  

Код показан ниже (включая создание df):

 df = pd.DataFrame([('a',[1, 3, 10, 12, 20],[2, 6, 23, 29]),
                   ('b',[2, 10, 1.4, 3],[4, 7, 8, 13]),
                   ('c',[],[98, 101, 200])],
                   columns = ['name','list1','list2'])

df['list3'] = df.apply(lambda row: list(np.hstack((np.asarray(row.list1), np.asarray(row.list2)))), axis=1)

print(df)
  

Вывод:

 0              [1, 3, 10, 12, 20, 2, 6, 23, 29]
1    [2.0, 10.0, 1.4, 3.0, 4.0, 7.0, 8.0, 13.0]
2                          [98.0, 101.0, 200.0]
Name: list3, dtype: object
  

Если вам нужен массив numpy, единственный способ заставить его работать:

 df['list3'] = df['list3'].apply(lambda x: np.array(x))

print(type(df['list3'].ix[0]))
Out[] : numpy.ndarray
  

Комментарии:

1. Спасибо за ваш ответ, но что, если бы я хотел, чтобы это был массив numpy?