So fügen Sie einer Pandas-Serie ein einzelnes Element hinzu

75

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?

eran
quelle
Verwandte: Erstellen Sie einen leeren Pandas DataFrame und füllen Sie ihn dann aus? - TLDR erstellt eine Liste und konvertiert sie am Ende in eine Serie.
cs95

Antworten:

44

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 .

Joaquin
quelle
Welche Version von Pandas benutzt du? Ich benutze 0.14.1 und erhalte die folgende Fehlermeldung: IndexError: index 0 is out of bounds for axis 0 with size 0
Ben
@ Ben, nicht sicher, Antwort ist älter als 2 Jahre. Ich habe mit 0.15.0 getestet und es funktioniert perfekt. Führen Sie denselben exakten Code aus ?
Joaquin
Ja, ich habe den Code gerade direkt in eine neue Konsole eingefügt. Seltsamerweise scheint es jetzt zu funktionieren!
Ben
1
In Python> 3 müssen Sie dies nicht tun, x = x.set_value(i, i**2)da x.set_value()eine xdirekte Änderung vorgenommen wird.
jeongmin.cha
15
Ja, set_value () ist veraltet. Verwenden Sie x.at[i] = i**2oder x.iat[i] = i**2.
Wolfgang Kuehn
39

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
Newtover
quelle
24

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

user2831683
quelle
2
Tolle Antwort, kurz und direkt.
Briford Wylie
1
Dies ist die beste Antwort
boardtc
12

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]))
fixxxer
quelle
3
Ich glaube, dass das Anhängen eine neue Serie zurückgibt (anstatt es an Ort und Stelle zu tun), also möchten Sietest = test.append(pd.Series(200, index=[101]))
A.Wan
1
@ A.Wan ja, hätte das klarer machen sollen. Vielen Dank!
Fixxxer
7

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
Derkammern
quelle
Der zweite Teil des Codes funktioniert nicht in Python 3
M. Chavoshi
3

Soweit die Lösung von @ joaqin veraltet ist, da die set_valueMethode 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
Jaroslav Bezděk
quelle
1
  • ser1 = pd.Sereis (np.linspace (1, 10, 2))
  • element = np.nan
  • ser1 = ser1.append (pd.Series (Element))
Faizanur Rahman
quelle
0

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