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

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

Кажется особенность, ведь 'A' уже является колонкой. Например, x ['B'] = y дает ожидаемый ValueError: Wrong number of items passed 2, placement implies 1.

ALollz 03.09.2018 04:37

Я бы ожидал, что это вызовет ключевую ошибку ...

doraemon 03.09.2018 04:42

о да, тоже есть.

ALollz 03.09.2018 04:45

Я согласен с тем, что ситуация до сих пор не ясна. В свете этого я не думаю, что должен быть принятый ответ. Я открыл проблема по этому поводу в репозитории pandas, и похоже, что это ошибка.

Socob 07.04.2021 22:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
18
4
640
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

для

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? первые столбцы?

doraemon 20.09.2018 04:13

@LiuSha Dataframe и Series имеют index. поскольку np.random.randn - это список со списком не проиндексированных.

yogkm 20.09.2018 14:37

Другие вопросы по теме