Неожиданное поведение при назначении двумерного массива массивов пандам DataFrame - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующий код:

x = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
y = np.random.randn(4, 2)
x['A'] = y

Я ожидаю, что это вызовет исключение из-за несоответствия формы. Но панды молча приняли назначение: первый столбец y назначен на x.

Это намеренный дизайн? Если да, то в чем причина?

Я пробовал оба pandas 0,21 и 0,23.


Спасибо за тех, кто пытался помочь. Тем не менее, никто не дает удовлетворительного ответа, хотя срок действия щедрости истекает.

Позвольте мне подчеркнуть, что ожидается в качестве ответа:

  1. является ли этот дизайн преднамеренным? Это ошибка? Это ложный дизайн?
  2. Каково обоснование для его разработки таким образом?

Поскольку щедрость истекает, я принял ответ с наибольшим количеством голосов. Но это не дает ответа на поставленные выше вопросы.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Ряды панд представляют собой массив numy, поскольку он состоит из одного столбца и обрабатывает его как один объект, на который ссылка была изменена.

>> import numpy as np
>>> x = np.zeros((4,1))
>>> x = np.random.randn(4,2)
>>> y= np.zeros((4,1))
>>> y
array([[0.],
       [0.],
       [0.],
       [0.]])
>>> x
array([[-1.00731291, -0.37151425],
       [-0.78154847, -0.72854126],
       [-0.98566253,  1.68786232],
       [ 0.12614892,  0.41804799]])
>>> y = x
>>>y
array([[-1.00731291, -0.37151425],
       [-0.78154847, -0.72854126],
       [-0.98566253,  1.68786232],
       [ 0.12614892,  0.41804799]])
0 голосов
/ 14 сентября 2018

Значения в y являются неиндексированной матрицей. Случай x['A'] = y работает здесь, так как он берет первый элемент из матрицы и присваивает его 'A'.

Аналогично,

x = pd.DataFrame(np.zeros((4, 2)), columns=['A', 'B'])
y = np.random.randn(4, 2)
x[['A', 'B']] = y

также будет работать, потому что лишние данные отбрасываются пандами. Если вы пытаетесь пропустить меньше столбцов, скажите:

x = pd.DataFrame(np.zeros((4, 2)), columns=['A', 'B'])
y = np.random.randn(4, 1)
x[['A', 'B']] = y

Это также будет работать, поскольку оно назначит одинаковые значения для обоих столбцов. Этот случай похож на x['A'] = 0, который заменит все данные в столбце A нулями.

0 голосов
/ 14 сентября 2018

для

x = pd.DataFrame(np.zeros((4, 1)), columns=['A'])
y = np.random.randn(4, 2)

если x ['A'] = y, то столбец реплицируется, и если мы повторяем его с разными длинами столбцов, такими как:

x = pd.DataFrame(np.zeros((4, 3)), columns=['A','B','C'])
y = np.random.randn(4, 2)

и попробуйте x ['A'] = y, тогда также будет реплицирован первый столбец, но если мы приравняем x = y, то кадр данных x будет реплицирован с матрицей y. Так что я думаю, что мы получаем эту двусмысленность, поскольку мы пытаемся приравнять столбец фрейма данных к матиксу, созданному в numpy. Надеюсь, это объясняет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...