2012-11-11 18 views
34

Jak dodać pojedynczy element do seryjnej serii panda. Wiem, że nie jest to najwydajniejszy sposób na pamięć, ale nadal muszę to robić.Jak dodać pojedynczy element do serii Pandas

Coś wzdłuż:

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

również, w jaki sposób można dodać jeden wiersz do DataFrame Pandy?

Odpowiedz

30

Jak dodać pojedynczy przedmiot. To nie jest bardzo skuteczne, ale następuje co prosicie:

x = p.Series() 
N = 4 
for i in xrange(N): 
    x = x.set_value(i, i**2) 

produkuje X:

0 0 
1 1 
2 4 
3 9 

Oczywiście istnieją lepsze sposoby generowania tej serii tylko w jednym ujęciu.

Aby uzyskać drugie pytanie, sprawdź odpowiedź i referencje pytania SO add one row in a pandas.DataFrame.

+0

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

+0

@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

+0

Tak, właśnie wkleiłem kod bezpośrednio do świeżej konsoli. Dziwnie wydaje się, że teraz działa! – Ben

12

Możesz użyć funkcji dołączania, aby dodać kolejny element. Tylko, wprowadza szereg nowych elementów, zanim dołączy go:

test.append(pd.Series(200, index=[101])) 
+1

Wierzę, że append zwraca nową serię (zamiast robić to w miejscu), więc chcesz 'test = test.append (pd.Series (200, index = [101])) –

3

Dodawanie do joquin na odpowiedzi na następujące pytania forma może być nieco czystsze (przynajmniej ładniej, aby przeczytać):

x = p.Series() 
N = 4 
for i in xrange(N): 
    x[i] = i**2 

który przyniosą taki sam efekt

również, trochę mniej ortodoksyjna, ale jeśli chcesz po prostu dodać jeden element do końca:

x=p.Series() 
value_to_append=5 
x[len(x)]=value_to_append 
7

Jeśli masz indeks i wartość. Następnie możesz dodać do Serii jako:

obj = Series([4,7,-5,3]) 
obj.index=['a', 'b', 'c', 'd'] 

obj['e'] = 181 

spowoduje to dodanie nowej wartości do Serii (na końcu serii).

19

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 
Powiązane problemy