Неожиданное поведение при назначении массива 2d numpy для pandas DataFrame

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

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. в чем смысл его проектирования таким образом?

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

Ответ 1

Значения в 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 нулями.

Ответ 2

за

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. Надеюсь, он объяснит

Ответ 3

Серия Pandas представляет собой массив numpy, так как он имеет один столбец, он рассматривает его как один объект, к которому ссылка была изменена.

>> 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]])