TLDR: nie dołączania elementów do szeregu jeden za drugim, lepiej przedłużyć z uporządkowanego zbioru
Myślę, że pytanie w obecnej formie jest nieco kłopotliwe. A zaakceptowana odpowiedź odpowiada na pytanie. Ale im częściej używam pand, tym bardziej rozumiem, że niewłaściwym pomysłem jest dołączanie przedmiotów do serii jeden po drugim. Spróbuję wyjaśnić, dlaczego dla początkujących pandy.
Można pomyśleć, że dołączanie danych do danej serii może pozwolić na ponowne wykorzystanie niektórych zasobów, ale w rzeczywistości seria jest tylko kontenerem, który przechowuje relację między indeksem a tablicą wartości. Każdy jest numpy.array pod maską, a indeks jest niezmienny. Po dodaniu do serii elementu z etykietą, której brakuje w indeksie, tworzony jest nowy indeks o rozmiarze n + 1 oraz nowa tablica wartości wartości o tym samym rozmiarze. Oznacza to, że gdy dodajesz elementy jeden po drugim, tworzysz dwie kolejne tablice o rozmiarze n + 1 na każdym kroku.
Nawiasem mówiąc, nie można dołączyć nowej pozycji według pozycji (otrzymasz IndexError), a etykieta w indeksie nie musi być unikalna, czyli kiedy przypisujesz wartość z etykietą, którą przypisujesz wartość do wszystkich istniejących elementów z etykietą, a nowy wiersz nie jest w tym przypadku dołączany. Może to prowadzić do subtelnych błędów.
Morał z tej historii polega na tym, że nie należy dodawać danych jeden po drugim, dlatego lepiej zaopatrzyć się w uporządkowaną kolekcję. Problem polega na tym, że nie można rozszerzyć Serii w miejscu. Dlatego lepiej jest zorganizować swój kod, aby nie trzeba było aktualizować konkretnej instancji serii przez odniesienie.
Jeśli sam tworzysz etykiety i one się zwiększają, najprościej jest dodać nowe pozycje do słownika, następnie utworzyć nową serię ze słownika (sortuje klucze) i dołączyć serię do starej. Jeśli klucze nie rosną, konieczne będzie utworzenie dwóch oddzielnych list dla nowych etykiet i nowych wartości.
Poniżej kilka próbek kodu:
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)
Kiedy zaktualizować istniejący element, indeks i tablicę wartości pozostają takie same (jeśli nie zmienić typ wartości)
In [7]: s[2] = 14
In [8]: id(s.index), id(s.values)
Out[8]: (4470549648, 4470593296)
Ale jeśli dodać nowy element, nowy indeks i nową tablicę wartości jest generowane:
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)
że s, jeśli chcesz dodać kilka elementów, zebrać je w słowniku, utworzyć serię, dołączyć do starej i zapisać wynik:
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
Jakiej wersji pandy używasz? Używam wersji 0.14.1 i pojawia się następujący błąd: 'IndexError: indeks 0 jest poza obszarem dla osi 0 o rozmiarze 0' – Ben
@Ben, nie jestem pewien, odpowiedź ma więcej niż 2 lata. Testowałem z 0.15.0 i działa idealnie. Czy wykonujesz ** ten sam dokładny kod **? – joaquin
Tak, właśnie wkleiłem kod bezpośrednio do świeżej konsoli. Dziwnie wydaje się, że teraz działa! – Ben