Wybór rzędu serii pand / ramki danych według indeksu liczb całkowitych


395

Jestem ciekawy, dlaczego df[2]nie jest obsługiwany, podczas gdy df.ix[2]i df[2:3]oba działają.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Spodziewałbym się, że będę df[2]działał w taki sam sposób, df[2:3]aby zachować zgodność z konwencją indeksowania w języku Python. Czy istnieje uzasadnienie konstrukcyjne braku obsługi indeksowania wiersza według pojedynczej liczby całkowitej?


4
df.ix[2]nie działa - przynajmniej nie wpandas version '0.19.2'
Zahra

9
Aby zobaczyć różnicę między wyborem wiersza i kolumny za pomocą operatora indeksowania [], zobacz tę odpowiedź poniżej . Również nigdy nie używać .ix, to jest przestarzałe
Ted Petrou

Odpowiedzi:


551

echo @HYRY, zobacz nowe dokumenty w 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Tutaj mamy nowych operatorów, .ilocaby obsługiwać wyłącznie indeksowanie liczb całkowitych, oraz .locobsługiwać tylko indeksowanie etykiet

np. wyobraź sobie ten scenariusz

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] wycina tylko wiersze (według lokalizacji etykiety)


7
Co jeśli chcesz 2. i 3. i 4. rząd?
FaCoffee

1
możesz po prostu przekazać listę indeksatorów; dokumenty są wskazane powyżej
Jeff

2
Czy ktoś ma uzasadnienie dla tych nazwisk? Trudno mi je zapamiętać, ponieważ nie jestem pewien, dlaczego ilocsą to wiersze i locetykiety.
kilodżule

3
@kilojoules .ilocsprawdza rzeczy według ich kolejności w indeksie (np. .iloc[[2]]) jest drugim „wierszem” w df. Że rząd dzieje się w indeksie lokalizacji 4. .locsprawdza je według ich wartości indeksu. Więc może „iloc” jest jak „i” jak wA[i] ? :)
Jim K.

1
@Jeff - działa świetnie, ale co się dzieje, gdy chcesz zduplikować wiersz z ramki danych, na przykład df.loc[-1] = df.iloc[[0]]i wstawić go? Ramka ma dodaną kolumnę indeksu dającą błąd ValueError: cannot set a row with mismatched columns (patrz stackoverflow.com/questions/47340571/... )
Growler,

63

Głównym celem operatora indeksującego DataFrame []jest wybranie kolumn.

Gdy operator indeksowania przekazuje ciąg lub liczbę całkowitą, próbuje znaleźć kolumnę o tej konkretnej nazwie i zwrócić ją jako Serię.

Tak więc w powyższym pytaniu: df[2]szuka nazwy kolumny pasującej do wartości całkowitej 2. Ta kolumna nie istnieje, a KeyErrorjest podnoszona.


Operator indeksowania DataFrame całkowicie zmienia zachowanie, aby wybrać wiersze, gdy używana jest notacja plastra

O dziwo, po otrzymaniu wycinka operator indeksowania DataFrame wybiera wiersze i może to zrobić według lokalizacji liczb całkowitych lub według etykiety indeksu.

df[2:3]

Będzie to ciąć, zaczynając od wiersza z liczbą całkowitą od 2 do 3, z wyjątkiem ostatniego elementu. Tak więc tylko jeden rząd. Poniżej zaznaczono wiersze zaczynające się od liczby całkowitej od 6 do, ale nie obejmującej 20 na co trzeci wiersz.

df[6:20:3]

Możesz także użyć wycinków składających się z etykiet ciągów, jeśli indeks DataFrame zawiera ciągi. Aby uzyskać więcej informacji, zobacz to rozwiązanie na .iloc vs. .loc .

Prawie nigdy nie używam tej notacji plastra z operatorem indeksowania, ponieważ nie jest ona jawna i rzadko używana. Podczas krojenia według rzędów trzymaj się .loc/.iloc.


Próba dodania wierszy do innej ramki danych za pomocą operatora niepokojącego, ale druga ramka danych pozostaje pusta. Dlaczego?
FindOutIslamNow

23

Możesz myśleć, że DataFrame to dyktand Series. df[key]spróbuj wybrać indeks kolumny keyi zwróci obiekt Series.

Jednak krojenie w [] wycina wiersze, ponieważ jest to bardzo częsta operacja.

Możesz przeczytać dokument w celu uzyskania szczegółowych informacji:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


Dziękuję za podpowiedź. Zabawne, tego rodzaju rzeczy sprawiają, że czasami pandy są pytaniami. Dodanie wyjątków do zachowania w określonych sytuacjach ... dla mnie to poczucie poświęcenia spójności dla odrobiny wygody.
Carl Berger

15

Aby uzyskać dostęp do tabeli pand na podstawie indeksu, można również rozważyć opcję numpy.as_array , aby przekonwertować tabelę na tablicę Numpy jako

np_df = df.as_matrix()

i wtedy

np_df[i] 

pracowałbym.


11
pokonuje to cały cel indeksów ramek danych i wszystkiego, co oferuje panda
Fábio Dias,

6

Możesz rzucić okiem na kod źródłowy .

DataFramema funkcję prywatną _slice()do wycinania DataFramei pozwala parametrowi axisokreślić, którą oś należy wyciąć. __getitem__()Na DataFramenie ustawić oś podczas wywoływania _slice(). Więc _slice()kawałek to domyślnie oś 0.

Możesz wykonać prosty eksperyment, który może ci pomóc:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

możesz przechodzić przez ramkę danych w ten sposób.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.