Die Schlussfolgerung ist, wie der Titel sagt. Auch in der offiziellen Dokumentation geschrieben.
Ein Kollege sagte: "Die Zuweisungsmethode von Pandas erstellt intern eine Kopie des Datenrahmens. Dies ist langsam und problematisch, da Speicherplatz verbraucht wird."
Ich bin süchtig danach, "Eradikationsausschuss für die Verarbeitung von Python / Pandas zur rekursiven Zuweisung" zu lesen und einen statistischen Stapelprozess unter Verwendung einer Methodenkette zu schreiben. Ich tat.
Wenn Sie sich jedoch den [tatsächlichen Pandas-Code] ansehen (https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492),
#Kommentare und andere Methoden werden weggelassen
class DataFrame(NDFrame):
def insert(self, loc, column, value, allow_duplicates=False):
data = self.copy()
# do all calculations first...
results = {}
for k, v in kwargs.items():
results[k] = com._apply_if_callable(v, data)
# ... and then assign
for k, v in sorted(results.items()):
data[k] = v
return data
Ich dachte: "Oh? Pythons Kopiermethode ist flache Kopie in Wörterbüchern und Arrays?" Aber
Wenn Sie die Kopiermethode in einem Wörterbuch oder Array verwenden, sind die darin enthaltenen Objekte daher identisch, und das Kopieren der darin enthaltenen Objekte beansprucht den Speicher nicht.
a = {'a': [1, 2, 3]}
b = a.copy()
#Der Inhalt von a und b ist der gleiche
assert a['a'] is b['a']
#Zerstörerische Veränderungen gehen über!
a['a'].append(4)
print(b)
# => {'a': [1, 2, 3, 4]}
Die Kopiermethode von Pandas (und die Zuweisungsmethode, die sie verwendet) scheint besser zu sein, sich um den Speicher zu kümmern, wenn es um große Datenrahmen geht.
import pandas as pd
df_a = pd.DataFrame({'a': [1, 2, 3]})
df_b = df_a.copy()
#Der Inhalt von a und b ist nicht der gleiche!
assert df_a['a'] is not df_b['a']
Ein halber Witz, sagte ich meinem Kollegen, wenn dies Haskell wäre, wäre es kein Problem, da eine flache Kopie keine destruktiven Änderungen vornehmen würde.
Dies ist ein Kommentar eines Kollegen. Ich würde gerne wissen, ob es einen Schreibstil gibt, der sowohl leicht zu verstehen als auch Speicher spart.
[Vorsicht bei der Beseitigung der rekursiven Substitution von Pandas] Ich denke, dass es viele Fälle gibt, in denen Zuweisung und Pipe verwendet werden, um eine rekursive Zuweisung zu vermeiden. Beachten Sie jedoch, dass Zuweisung eine Kopie von df selbst ist, sodass sie viel langsamer ist. Auf der anderen Seite wird die Pipe nicht kopiert, also ist es okay
assign https://github.com/pandas-dev/pandas/blob/v0.20.3/pandas/core/frame.py#L2492 pipe https://github.com/pandas-dev/pandas/blob/v0.19.2/pandas/core/generic.py#L2698-L2708
Ich denke jedoch, dass es wahr ist, dass das Zuweisen als UI einfach zu lesen ist
- Reduzieren Sie die Anzahl der Zuweisungen so weit wie möglich (es ist in Ordnung, mehrere Spalten mit einer Zuweisung hinzuzufügen, da keine Kopie erfolgt).
- Schütteln und rekursiv ersetzen
Ich frage mich, ob ich es am besten kann ...
Übrigens habe ich die Spalten eingegrenzt, bevor ich sie an die Zuweisung übergeben habe, und versucht, den zurückgegebenen Datenrahmen in den ursprünglichen Datenrahmen zu konvertieren. Im Gegenteil, er war erheblich langsamer, sodass dies auch nicht sehr gut ist
Recommended Posts