Неожиданное поведение при назначении массива 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
Значения в 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]])