Ich verstehe, dass Pandas so konzipiert sind, dass sie vollständig ausgefüllt geladen werden, DataFrame
aber ich muss einen leeren DataFrame erstellen und dann nacheinander Zeilen hinzufügen . Was ist der beste Weg, dies zu tun?
Ich habe erfolgreich einen leeren DataFrame erstellt mit:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Dann kann ich eine neue Zeile hinzufügen und ein Feld füllen mit:
res = res.set_value(len(res), 'qty1', 10.0)
Es funktioniert, scheint aber sehr seltsam: - / (es schlägt fehl, einen Zeichenfolgenwert hinzuzufügen)
Wie kann ich meinem DataFrame eine neue Zeile hinzufügen (mit unterschiedlichem Spaltentyp)?
Antworten:
quelle
.loc
verweist auf die Indexspalte. Wenn Sie also mit einem bereits vorhandenen DataFrame mit einem Index arbeiten, der keine fortlaufende Folge von Ganzzahlen ist, die mit 0 beginnen (wie in Ihrem Beispiel),.loc
werden vorhandene Zeilen überschrieben oder Zeilen eingefügt oder Erstellen Sie Lücken in Ihrem Index. Ein robusterer (aber nicht narrensicherer) Ansatz zum Anhängen eines vorhandenen Datenrahmens ungleich Null wäre Folgendes:df.loc[df.index.max() + 1] = [randint(...
oder das Vorabfüllen des Index, wie von @FooBar vorgeschlagen.df.index.max()
ist,nan
wenn der DataFrame leer ist.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
Wenn Sie alle Daten für den Datenrahmen im Voraus abrufen können, gibt es einen viel schnelleren Ansatz als das Anhängen an einen Datenrahmen:
Ich hatte eine ähnliche Aufgabe, bei der das zeilenweise Anhängen an einen Datenrahmen 30 Minuten dauerte und das Erstellen eines Datenrahmens aus einer Liste von Wörterbüchern innerhalb von Sekunden abgeschlossen wurde.
quelle
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Sie könnten
pandas.concat()
oder verwendenDataFrame.append()
. Einzelheiten und Beispiele finden Sie unter Zusammenführen, Verbinden und Verketten .quelle
.loc
Mechanismus, der vermieden werden kann, insbesondere wenn Sie vorsichtig sind.DataFrame.append()
, müssen Sie sicherstellen, dass Ihre Zeilendaten in erster Linie auch ein DataFrame und keine Liste sind.Es ist lange her, aber ich hatte auch das gleiche Problem. Und hier viele interessante Antworten gefunden. Also war ich verwirrt, welche Methode ich verwenden sollte.
Wenn ich dem Datenrahmen viele Zeilen hinzufüge, bin ich an der Geschwindigkeitsleistung interessiert . Also habe ich 4 der beliebtesten Methoden ausprobiert und ihre Geschwindigkeit überprüft.
AKTUALISIERT 2019 mit neuen Versionen von Paketen. Auch nach @FooBar Kommentar aktualisiert
GESCHWINDIGKEITSLEISTUNG
Ergebnisse (in Sekunden):
Auch danke an Vielen @krassowski für den nützlichen Kommentar - ich habe den Code aktualisiert.
Also benutze ich Addition durch das Wörterbuch für mich.
Code:
PS Ich glaube, meine Realisierung ist nicht perfekt, und vielleicht gibt es eine Optimierung.
quelle
df2.index.max()
for.loc
erhöht unnötig die Rechenkomplexität. Einfachdf2.loc[i] = ...
würde reichen. Für mich reduzierte es die Zeit von 10 auf 8,64 SekundenWenn Sie die Anzahl der Einträge im Voraus kennen, sollten Sie den Speicherplatz vorab zuweisen, indem Sie auch den Index angeben (wobei das Datenbeispiel einer anderen Antwort entnommen wird):
Geschwindigkeitsvergleich
Und - wie aus den Kommentaren hervorgeht - mit einer Größe von 6000 wird der Geschwindigkeitsunterschied noch größer:
quelle
quelle
Informationen zum effizienten Anhängen finden Sie unter Hinzufügen einer zusätzlichen Zeile zu einem Pandas-Datenrahmen und Einstellen mit Erweiterung .
Fügen Sie Zeilen
loc/ix
zu nicht vorhandenen Schlüsselindexdaten hinzu. z.B :Oder:
quelle
Mit der
ignore_index
Option können Sie eine einzelne Zeile als Wörterbuch anhängen .quelle
f.append(<stuff>)
ein neues Objekt erstellt wird, anstatt nur an das aktuelle Objekt anzuhängen. Wenn Sie also versuchen, einen Datenrahmen in einem Skript anzuhängen, müssen Sie sagenf = f.append(<stuff>)
Um der pythonischen Art willen, füge hier meine Antwort hinzu:
quelle
Sie können auch eine Liste von Listen erstellen und in einen Datenrahmen konvertieren.
geben
quelle
Dies ist keine Antwort auf die OP-Frage, sondern ein Spielzeugbeispiel, um die Antwort von @ShikharDua zu veranschaulichen, über der ich sehr nützlich fand.
Während dieses Fragment trivial ist, hatte ich in den tatsächlichen Daten 1000 Zeilen und viele Spalten, und ich wollte in der Lage sein, nach verschiedenen Spalten zu gruppieren und dann die folgenden Statistiken für mehr als eine Taget-Spalte auszuführen. Eine zuverlässige Methode zum zeilenweisen Erstellen des Datenrahmens war daher sehr praktisch. Vielen Dank, dass Sie @ShikharDua!
quelle
Einfach und schön herausgefunden:
quelle
Sie können ein Generatorobjekt verwenden, um einen Datenrahmen zu erstellen, der über die Liste speichereffizienter ist.
Um Raw zu vorhandenem DataFrame hinzuzufügen, können Sie die Append-Methode verwenden.
quelle
Erstellen Sie einen neuen Datensatz ( Datenrahmen ) und fügen Sie ihn zu old_data_frame hinzu . Übergeben Sie eine
Liste mit Werten und entsprechenden Spaltennamen , um einen neuen Datensatz (Datenrahmen) zu erstellen.
quelle
Hier ist die Möglichkeit, eine Zeile hinzuzufügen / anzuhängen
pandas DataFrame
Es kann verwendet werden, um eine Zeile in einen leeren oder ausgefüllten Pandas DataFrame einzufügen / anzuhängen
quelle
Anstelle einer Liste von Wörterbüchern wie in ShikharDuas Antwort können wir unsere Tabelle auch als ein Wörterbuch von Listen darstellen , in dem jede Liste eine Spalte in Zeilenreihenfolge speichert, sofern wir unsere Spalten vorher kennen. Am Ende erstellen wir unseren DataFrame einmal.
Für c Spalten und n Zeilen werden 1 Wörterbuch und c Listen verwendet, gegenüber 1 Liste und n Wörterbüchern. In der Methode "Liste der Wörterbücher" werden in jedem Wörterbuch alle Schlüssel gespeichert, und für jede Zeile muss ein neues Wörterbuch erstellt werden. Hier hängen wir nur an Listen an, was zeitlich konstant und theoretisch sehr schnell ist.
quelle
Wenn Sie am Ende eine Zeile hinzufügen möchten, fügen Sie diese als Liste hinzu
quelle
Ein anderer Weg, dies zu tun (wahrscheinlich nicht sehr performant):
Sie können die DataFrame-Klasse auch folgendermaßen erweitern:
quelle
Mach es einfach. Indem Sie die Liste als Eingabe verwenden, die als Zeile im Datenrahmen angehängt wird: -
quelle
Alles was Sie brauchen ist
loc[df.shape[0]]
oderloc[len(df)]
oder
quelle
Wir sehen oft das Konstrukt
df.loc[subscript] = …
, das einer DataFrame-Zeile zugewiesen werden soll. Mikhail_Sam hat am Ende Benchmarks veröffentlicht , die unter anderem dieses Konstrukt sowie die Methode dict und create DataFrame enthalten . Letzteres war bei weitem das schnellste. Wenn wir jedoch dendf3.loc[i] = …
(durch vorab zugewiesenen DataFrame) in seinem Code durch ersetzendf3.values[i] = …
, ändert sich das Ergebnis erheblich, da diese Methode ähnlich wie die mit dict funktioniert. Deshalb sollten wir öfter die Verwendung vondf.values[subscript] = …
in Betracht ziehen. Beachten Sie jedoch, dass.values
ein auf Null basierender Index erforderlich ist, der sich möglicherweise vom DataFrame.index unterscheidet.quelle
# .loc with prealloc
), ein weiteres Beispiel ist die Frage, ob ich Daten aus jeder Zeile eines Pandas DataFrame mit Daten aus den übrigen Zeilen vergleichen muss. Gibt es eine Möglichkeit, die Berechnung zu beschleunigen? ? und seine akzeptierte Antwort.pandas.DataFrame.append
DataFrame.append (self, other, ignore_index = False, verify_integrity = False, sort = False) → 'DataFrame'
Wenn ignore_index auf True gesetzt ist:
quelle
Bevor wir eine Zeile hinzufügen, müssen wir den Datenrahmen in ein Wörterbuch konvertieren. Dort können Sie die Schlüssel als Spalten im Datenrahmen sehen und die Werte der Spalten werden erneut im Wörterbuch gespeichert. Der Schlüssel für jede Spalte ist jedoch die Indexnummer im Datenrahmen. Diese Idee bringt mich dazu, den folgenden Code zu schreiben.
quelle
Sie können hierfür zwei DataFrames verketten. Grundsätzlich bin ich auf dieses Problem gestoßen, indem ich einem vorhandenen DataFrame eine neue Zeile mit einem Zeichenindex (nicht numerisch) hinzugefügt habe. Also gebe ich die Daten für eine neue Zeile in einen Kanal () und den Index in eine Liste ein.
quelle
Dadurch wird ein Element zu einem leeren DataFrame hinzugefügt. Das Problem ist das
df.index.max() == nan
für den ersten Index:quelle