web-dev-qa-db-de.com

Unerwartetes Verhalten beim Zuweisen eines 2d-numpy-Arrays zu Pandas DataFrame

Ich habe folgenden Code:

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

Ich erwarte, dass es eine Ausnahme gibt, weil die Form nicht stimmt. Die Pandas akzeptierten jedoch still die Zuordnung: Die erste Spalte von y wird x zugewiesen.

Ist das ein vorsätzliches Design? Wenn ja, welche Gründe stecken dahinter?

Ich habe sowohl pandas 0.21 als auch 0.23 ausprobiert.


Danke für die, die versucht haben zu helfen. Allerdings gibt niemand eine befriedigende Antwort, obwohl die Prämie ausläuft. 

Lassen Sie mich betonen, was als Antwort erwartet wird: 

  1. ob dieses Design beabsichtigt ist? Ist es ein Fehler? Ist es ein falscher Entwurf?
  2. Was ist der Grund, es so zu gestalten?

Da die Prämie ausläuft, akzeptierte ich die am meisten gewählte Antwort. Es gibt jedoch keine Antwort auf die oben genannten Fragen.

17
Liu Sha

Die Werte in y sind nicht indizierte Matrix. Der Fall x['A'] = y funktioniert hier, da das erste Element aus der Matrix entnommen und dem 'A' zugewiesen wird.

Ähnlich,

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

funktioniert auch, weil die zusätzlichen Daten von Pandas gelöscht werden .. Wenn Sie versuchen, weniger Spalten zu übergeben, sagen Sie:

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

Das funktioniert auch, da es den beiden Spalten die gleichen Werte zuweist. Dieser Fall ähnelt x['A'] = 0, der alle Daten in Spalte A durch Nullen ersetzt.

6
yogkm

zum 

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

wenn x ['A'] = y ist, wird die Spalte repliziert und wenn wir sie mit verschiedenen Spaltenlängen iterieren, z.

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

und versuchen Sie x ['A'] = y, dann wird auch die erste Spalte repliziert, aber wenn wir x = y gleichsetzen, wird der x-Datenrahmen mit der y-Matrix repliziert. Ich denke, wir bekommen diese Mehrdeutigkeit, wenn wir versuchen, eine Datenrahmenspalte mit einem in numpy erstellten Matix gleichzusetzen. Hoffe, es erklärt

0
Abhishek Kumar

Pandas-Serien sind ein numpy-Array, da es eine Spalte enthält und es als ein Objekt behandelt, zu dem sich die Referenz geändert hat.

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