2013-02-28 10 views
5

Jestem nieco zaskoczony/mylić o następującej różnicy między numpy i PandStart: przestań kroić niespójności między numpy i Pandami?

import numpy as np 
import pandas as pd 
a = np.random.randn(10,10) 

> a[:3,0, newaxis] 

array([[-1.91687144], 
     [-0.6399471 ], 
     [-0.10005721]]) 

Jednakże:

b = pd.DataFrame(a) 

> b.ix[:3,0] 

0 -1.916871 
1 -0.639947 
2 -0.100057 
3 0.251988 

Innymi słowy, numpy nie obejmuje indeks stop w start:stop notacji, ale Pandy robi. Myślałem, że Panda jest oparta na Numpy. Czy to błąd? Zamierzony?

+1

Dlaczego używasz 'b.ix' zamiast tylko' b [: 3] '? – abarnert

Odpowiedz

3

Ten jest udokumentowane, a to część Advanced Indexing. Kluczem jest to, że w ogóle nie używasz wskaźnika zatrzymania.

Atrybut ix jest specjalnym rzeczą, która pozwala robić różnego rodzaju zaawansowanych indeksowania przez wytwórnię -choosing listę etykiet, używając integracyjnego gamę etykiet zamiast pół wyłączności zakres indeksów, i różne inne rzeczy.

Jeśli nie chcesz, że po prostu nie używać go:

In [191]: b[:3][0] 
Out[191]: 
0 -0.209386 
1 0.050345 
2 0.318414 
Name: 0 

Jeśli grasz z tym nieco bardziej bez czytania docs, prawdopodobnie pochodzić z przypadku, gdzie etykiety to, na przykład, 'A', 'B', 'C', 'D' zamiast 0, 1, 2, 3, i nagle b.ix[:3] zwróci tylko 3 wiersze zamiast 4, a będziesz znowu zaskoczony.

Różnica polega na tym, że w tym przypadku b.ix[:3] to plaster na indeksów, a nie na etykiet.

To, czego żądałeś w swoim kodzie, jest niejednoznaczne między "wszystkimi etykietami aż do 3" i "wszystkimi indeksami aż do 3, ale nie", a etykiety zawsze wygrywają z ix (bo jeśli nie chcesz przecinać etykiety, w pierwszej kolejności nie musisz używać ix). I dlatego powiedziałem, że problem polega na tym, że w ogóle nie używasz wskaźnika zatrzymania.

+0

W twoim przykładzie zwraca kopię. Będziesz musiał użyć .loc lub .iloc do przypisania, prawda? –

1

Od (docs):

Odcinanie posiada standardowe semantyki Pythona do całkowitych plastry

...

Odcinanie z etykietami jest semantycznie nieco inaczej, ponieważ początek plaster i przysłona są włącznie w przypadku na etykiecie.

+0

Dobrze, ale w jaki sposób można wycinać etykiety na jednym końcu (jak normalne cięcie przez Pythona!)? –

2

Gdy typ indeksu jest liczbą całkowitą, DataFrame.ix będzie używać tylko indeksowania opartego na etykietach. Zgodnie z dokumentem plasterek oparty na etykietach będzie zawierał początek i koniec.

http://pandas.pydata.org/pandas-docs/dev/indexing.html#advanced-indexing-with-labels

Odcinanie z etykietami jest semantycznie nieco inaczej, ponieważ początek plaster i przysłona są włącznie w przypadku etykiet na bazie.

Indeksowanie oparte na etykietach z etykietami na liczbach całkowitych jest trudnym tematem.To zostało szeroko omówione na listach mailingowych i wśród różnych członków społeczności naukowej Python. W przypadku pand, nasz ogólny punkt widzenia jest taki, że etykiety mają więcej niż lokalizacje całkowite. Dlatego przy indeksie liczby całkowitej tylko indeksowanie oparte na etykietach jest możliwe przy standardowym narzędziu , takim jak .ix. Poniższy kod wygeneruje wyjątki

Powiązane problemy