Wie füge ich einer serialisierten Panda-Serie ein einzelnes Element hinzu? Ich weiß, dass es in Bezug auf das Gedächtnis nicht die effizienteste Art ist, aber das muss ich noch tun.
Etwas mit:
>> x = Series()
>> N = 4
>> for i in xrange(N):
>> x.some_appending_function(i**2)
>> print x
0 | 0
1 | 1
2 | 4
3 | 9
Wie kann ich einem Pandas DataFrame eine einzelne Zeile hinzufügen?
Antworten:
So fügen Sie einen einzelnen Artikel hinzu. Dies ist nicht sehr effektiv, folgt aber dem, wonach Sie fragen:
x = p.Series() N = 4 for i in xrange(N): x = x.set_value(i, i**2)
erzeugt x:
0 0 1 1 2 4 3 9
Offensichtlich gibt es bessere Möglichkeiten, diese Serie in nur einem Schuss zu generieren.
Für Ihre zweite Frage überprüfen Sie die Antwort und die Referenzen der SO-Frage und fügen Sie eine Zeile in einem pandas.DataFrame hinzu .
quelle
IndexError: index 0 is out of bounds for axis 0 with size 0
x = x.set_value(i, i**2)
dax.set_value()
einex
direkte Änderung vorgenommen wird.x.at[i] = i**2
oderx.iat[i] = i**2
.TLDR: Fügen Sie keine Artikel einzeln an eine Serie an, sondern erweitern Sie sie besser um eine bestellte Sammlung
Ich denke, die Frage in ihrer jetzigen Form ist etwas knifflig. Und die akzeptierte Antwort beantwortet die Frage. Aber je häufiger ich Pandas benutze, desto mehr verstehe ich, dass es eine schlechte Idee ist, Elemente einzeln an eine Serie anzuhängen. Ich werde versuchen zu erklären, warum für Pandas Anfänger.
Sie könnten denken, dass Sie durch Anhängen von Daten an eine bestimmte Serie einige Ressourcen wiederverwenden können. In Wirklichkeit ist eine Serie jedoch nur ein Container, in dem eine Beziehung zwischen einem Index und einem Wertearray gespeichert wird. Jedes ist ein numpy.array unter der Haube, und der Index ist unveränderlich. Wenn Sie der Serie ein Element mit einer Beschriftung hinzufügen, die im Index fehlt, wird ein neuer Index mit der Größe n + 1 erstellt und ein neues Wertewertarray mit derselben Größe. Das heißt, wenn Sie Elemente einzeln anhängen, erstellen Sie bei jedem Schritt zwei weitere Arrays der Größe n + 1.
Übrigens können Sie ein neues Element nicht nach Position anhängen (Sie erhalten einen IndexError) und die Beschriftung in einem Index muss nicht eindeutig sein. Wenn Sie also einen Wert mit einer Beschriftung zuweisen, weisen Sie den Wert allen zu Vorhandene Elemente mit der Bezeichnung und einer neuen Zeile werden in diesem Fall nicht angehängt. Dies kann zu subtilen Fehlern führen.
Die Moral der Geschichte ist, dass Sie Daten nicht einzeln anhängen sollten, sondern besser mit einer geordneten Sammlung erweitern sollten. Das Problem ist, dass Sie eine Serie nicht an Ort und Stelle erweitern können. Aus diesem Grund ist es besser, Ihren Code so zu organisieren, dass Sie eine bestimmte Instanz einer Serie nicht durch Referenz aktualisieren müssen.
Wenn Sie selbst Beschriftungen erstellen und diese zunehmen, können Sie am einfachsten neue Elemente zu einem Wörterbuch hinzufügen, dann eine neue Serie aus dem Wörterbuch erstellen (die Schlüssel werden sortiert) und die Serie an eine alte anhängen. Wenn die Schlüssel nicht erhöht werden, müssen Sie zwei separate Listen für die neuen Beschriftungen und die neuen Werte erstellen.
Nachfolgend einige Codebeispiele:
In [1]: import pandas as pd In [2]: import numpy as np In [3]: s = pd.Series(np.arange(4)**2, index=np.arange(4)) In [4]: s Out[4]: 0 0 1 1 2 4 3 9 dtype: int64 In [6]: id(s.index), id(s.values) Out[6]: (4470549648, 4470593296)
Wenn wir ein vorhandenes Element aktualisieren, bleiben der Index und das Wertearray gleich (wenn Sie den Werttyp nicht ändern).
In [7]: s[2] = 14 In [8]: id(s.index), id(s.values) Out[8]: (4470549648, 4470593296)
Wenn Sie jedoch ein neues Element hinzufügen, werden ein neuer Index und ein neues Wertearray generiert:
In [9]: s[4] = 16 In [10]: s Out[10]: 0 0 1 1 2 14 3 9 4 16 dtype: int64 In [11]: id(s.index), id(s.values) Out[11]: (4470548560, 4470595056)
Das heißt, wenn Sie mehrere Elemente anhängen, sie in einem Wörterbuch sammeln, eine Serie erstellen, sie an die alte anhängen und das Ergebnis speichern möchten:
In [13]: new_items = {item: item**2 for item in range(5, 7)} In [14]: s2 = pd.Series(new_items) In [15]: s2 # keys are guaranteed to be sorted! Out[15]: 5 25 6 36 dtype: int64 In [16]: s = s.append(s2); s Out[16]: 0 0 1 1 2 14 3 9 4 16 5 25 6 36 dtype: int64
quelle
Wenn Sie einen Index und einen Wert haben. Dann können Sie zur Serie hinzufügen als:
obj = Series([4,7,-5,3]) obj.index=['a', 'b', 'c', 'd'] obj['e'] = 181
Dadurch wird der Serie ein neuer Wert hinzugefügt (am Ende der Serie).
quelle
Mit der Append-Funktion können Sie ein weiteres Element hinzufügen. Erstellen Sie nur eine Reihe des neuen Elements, bevor Sie es anhängen:
test = test.append(pd.Series(200, index=[101]))
quelle
test = test.append(pd.Series(200, index=[101]))
Wenn Sie zu Joquins Antwort hinzufügen, könnte das folgende Formular etwas sauberer sein (zumindest besser zu lesen):
x = p.Series() N = 4 for i in xrange(N): x[i] = i**2
das würde die gleiche Ausgabe erzeugen
auch ein bisschen weniger orthodox, aber wenn Sie einfach ein einzelnes Element am Ende hinzufügen möchten:
x=p.Series() value_to_append=5 x[len(x)]=value_to_append
quelle
Soweit die Lösung von @ joaqin veraltet ist, da die
set_value
Methode in einer zukünftigen Pandas-Version entfernt wird, würde ich die andere Option erwähnen, mit Pandor ein einzelnes Element zur Pandas-Serie hinzuzufügen.at[]
.>>> import pandas as pd >>> x = pd.Series() >>> N = 4 >>> for i in range(N): ... x.at[i] = i**2
Es erzeugt die gleiche Ausgabe.
>>> print(x) 0 0 1 1 2 4 3 9
quelle
quelle
Hier ist ein weiterer Gedanke n zum Anhängen mehrerer Elemente in einer Zeile, ohne den Namen der Serie zu ändern. Dies ist jedoch möglicherweise nicht so effizient wie die andere Antwort.
>>> df = pd.Series(np.random.random(5), name='random') >>> df 0 0.363885 1 0.402623 2 0.450449 3 0.172917 4 0.983481 Name: random, dtype: float64 >>> df.to_frame().T.assign(a=3, b=2, c=5).squeeze() 0 0.363885 1 0.402623 2 0.450449 3 0.172917 4 0.983481 a 3.000000 b 2.000000 c 5.000000 Name: random, dtype: float64
quelle