У меня такой код:
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.
Спасибо тем, кто пытался помочь. Однако никто не дает удовлетворительного ответа, хотя срок награды истекает.
Позвольте мне подчеркнуть то, что ожидается в качестве ответа:
Поскольку срок действия награды истекает, я принял ответ, получивший наибольшее количество голосов. Но он не дает ответа на поставленные выше вопросы.
Я бы ожидал, что это вызовет ключевую ошибку ...
о да, тоже есть.
Я согласен с тем, что ситуация до сих пор не ясна. В свете этого я не думаю, что должен быть принятый ответ. Я открыл проблема по этому поводу в репозитории pandas, и похоже, что это ошибка.






для
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. Итак, я думаю, мы получаем эту двусмысленность, когда пытаемся приравнять столбец фрейма данных к matix, созданному в numpy. Надеюсь, это объяснит
Серии 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]])
Значения в 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 заменяются нулями.
что вы подразумеваете под "неиндексированной матрицей" и что является первым элементом y? первые столбцы?
@LiuSha Dataframe и Series имеют index. поскольку np.random.randn - это список со списком не проиндексированных.
Кажется особенность, ведь
'A'уже является колонкой. Например, x ['B'] = y дает ожидаемыйValueError: Wrong number of items passed 2, placement implies 1.