web-dev-qa-db-fra.com

Comportement inattendu lors de l'attribution d'un tableau 2D numpy à des pandas DataFrame

J'ai le code suivant:

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

Je m'attends à ce qu'il jette une exception en raison de l'inadéquation des formes. Mais les pandas ont accepté la tâche en silence: la première colonne de y est affectée à x.

Est-ce une conception intentionnelle? Si oui, quelle est la raison derrière?

J'ai essayé les deux pandas 0.21 et 0.23.


Merci pour ceux qui ont essayé d'aider. Cependant, personne ne donne une réponse satisfaisante bien que la prime expire. 

Permettez-moi de souligner ce qui est attendu comme réponse: 

  1. si cette conception est intentionnelle? Est-ce un bug? Est-ce un faux design?
  2. quelle est la raison de le concevoir de cette manière?

Comme la prime va expirer, j'ai accepté la réponse la plus votée. Mais cela ne répond pas aux questions ci-dessus.

17
Liu Sha

Les valeurs dans y sont des matrices non indexées. Le cas x['A'] = y fonctionne ici car il prend le premier élément de la matrice et l'assigne au 'A'.

De même,

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

cela fonctionnera également car les données supplémentaires sont supprimées par les pandas ... Si vous essayez de passer moins de colonnes, dites:

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

Cela fonctionnera également car il affectera les mêmes valeurs aux deux colonnes. Ce cas est similaire à x['A'] = 0 qui remplacera toutes les données de la colonne A par des zéros.

6
yogkm

pour 

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

si x ['A'] = y; alors la colonne est répliquée et si nous l'itérons avec différentes longueurs de colonne telles que:

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

et essayez x ['A'] = y, la première colonne est également répliquée, mais si nous égalons x = y, le bloc de données x est répliqué avec la matrice y. Donc, je suppose que nous obtenons cette ambiguïté alors que nous essayons d'assimiler une colonne de trame de données à un matix créé dans numpy . J'espère que cela explique

0
Abhishek Kumar

Les séries de pandas sont des tableaux numpy. Depuis sa colonne, il le traite comme un objet unique, auquel la référence a changé.

>> 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
Eliethesaiyan