#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?