Wie füge ich pandas DataFrames ohne das kopieren der Daten?
Möchte ich zum verketten von zwei pandas DataFrames ohne kopieren der Daten. Das ist, möchte ich die verkettete DataFrame um eine Sicht auf die Daten in den beiden original-DataFrames. Ich habe versucht, mit concat() und das hat nicht funktioniert. Dieser code-block zeigt, dass eine änderung der zugrunde liegenden Daten beeinflusst die beiden DataFrames, die verkettet sind, aber nicht die verkettete DataFrame:
arr = np.random.randn(12).reshape(6, 2)
df = pd.DataFrame(arr, columns = ('VALE5', 'PETR4'), index = dates)
arr2 = np.random.randn(12).reshape(6, 2)
df2 = pd.DataFrame(arr, columns = ('AMBV3', 'BBDC4'), index = dates)
df_concat = pd.concat(dict(A = df, B = df2),axis=1)
pp(df)
pp(df_concat)
arr[0, 0] = 9999999.99
pp(df)
pp(df_concat)
Dies ist die Ausgabe der letzten fünf Zeilen. df geändert, nachdem ein neuer Wert zugewiesen wurde, arr[0, 0]; df_concat war nicht betroffen.
In [56]: pp(df)
VALE5 PETR4
2013-01-01 -0.557180 0.170073
2013-01-02 -0.975797 0.763136
2013-01-03 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442
2013-01-06 -0.323640 0.024857
In [57]: pp(df_concat)
A B
VALE5 PETR4 AMBV3 BBDC4
2013-01-01 -0.557180 0.170073 -0.557180 0.170073
2013-01-02 -0.975797 0.763136 -0.975797 0.763136
2013-01-03 -0.913254 1.042521 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442 -1.259005 1.448442
2013-01-06 -0.323640 0.024857 -0.323640 0.024857
In [58]: arr[0, 0] = 9999999.99
In [59]: pp(df)
VALE5 PETR4
2013-01-01 9999999.990000 0.170073
2013-01-02 -0.975797 0.763136
2013-01-03 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442
2013-01-06 -0.323640 0.024857
In [60]: pp(df_concat)
A B
VALE5 PETR4 AMBV3 BBDC4
2013-01-01 -0.557180 0.170073 -0.557180 0.170073
2013-01-02 -0.975797 0.763136 -0.975797 0.763136
2013-01-03 -0.913254 1.042521 -0.913254 1.042521
2013-01-04 -1.973013 -2.069460 -1.973013 -2.069460
2013-01-05 -1.259005 1.448442 -1.259005 1.448442
2013-01-06 -0.323640 0.024857 -0.323640 0.024857
Ich denke, das bedeutet concat () - erstellt eine Kopie der Daten. Gibt es eine Möglichkeit zu vermeiden, eine Kopie gemacht werden? (Ich will Speichernutzung zu minimieren).
Außerdem gibt es eine schnelle Möglichkeit, zu überprüfen, ob zwei DataFrames sind im Zusammenhang mit der gleichen zugrunde liegenden Daten? (kurze gehen durch die Mühe, die Daten zu verändern und die Kontrolle, wenn jeder DataFrame geändert hat)
Danke für die Hilfe.
FS
- Derzeit der beste Weg, um zu überprüfen, ob zwei numpy-arrays sind die gemeinsame Nutzung von Speicher finden Sie hier: stackoverflow.com/questions/10747748/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht (zumindest leicht). Wenn Sie anrufen
concat
letztlichnp.concatenate
aufgerufen wird.Sehen diese Antwort erklärt, warum Sie können keine arrays verketten, ohne Sie zu kopieren. Die Kurzfassung ist, dass die arrays sind nicht unbedingt zusammenhängend im Speicher.
Hier ist ein einfaches Beispiel
Ausgabe:
Obwohl
x
undy
teilen die gleichenbase
nämlicha
,concatenate
(und damitvstack
), kann nicht davon ausgehen, dass Sie tun, da man oft will verketten beliebig strided-arrays.Ihnen die einfache Erstellung von zwei arrays mit unterschiedlichen Schritten, welche die gleiche Erinnerung wie so:
Ausgabe:
Dies ist, warum Folgendes passiert:
EDIT: Mit
pd.merge(df1, df2, copy=False)
(oderdf1.merge(df2, copy=False)
), wenndf1.dtype != df2.dtype
wird nicht eine Kopie machen. Ansonsten wird eine Kopie gemacht.merge
hat einecopy
parameter, so dass, wenn ich tundf_concat = df.merge(df1, left_index=True, right_index=True, copy=False)
Wenn die Indizes der beiden DataFrames sind die gleichen (die in diesem Fall wahr ist, ist die Serie von Objekten nicht geändert werden, warum ist pandas kopieren der Daten, wenn ich explizit angewiesen, es nicht mitcopy=False
? Auch wenn ich zuerst einen index erstellen, und erstellen Sie dann diedf
,df
unddf_concat
unddf.index is
df_concat.index` zurückTrue
noch die Daten kopiert werden.copy
parameter dermerge
- Funktion funktioniert? 🙂