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?
df.ix[2]
nie działa - przynajmniej nie wpandas version '0.19.2'
[]
, zobacz tę odpowiedź poniżej . Również nigdy nie używać.ix
, to jest przestarzałeOdpowiedzi:
echo @HYRY, zobacz nowe dokumenty w 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Tutaj mamy nowych operatorów,
.iloc
aby obsługiwać wyłącznie indeksowanie liczb całkowitych, oraz.loc
obsługiwać tylko indeksowanie etykietnp. wyobraź sobie ten scenariusz
[]
wycina tylko wiersze (według lokalizacji etykiety)źródło
iloc
są to wiersze iloc
etykiety..iloc
sprawdza rzeczy według ich kolejności w indeksie (np..iloc[[2]]
) jest drugim „wierszem” wdf
. Że rząd dzieje się w indeksie lokalizacji4
..loc
sprawdza je według ich wartości indeksu. Więc może „iloc” jest jak „i” jak wA[i]
? :)df.loc[-1] = df.iloc[[0]]
i wstawić go? Ramka ma dodaną kolumnę indeksu dającą błądValueError: cannot set a row with mismatched columns
(patrz stackoverflow.com/questions/47340571/... )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łkowitej2
. Ta kolumna nie istnieje, aKeyError
jest 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.
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.
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
.źródło
Możesz myśleć, że DataFrame to dyktand Series.
df[key]
spróbuj wybrać indeks kolumnykey
i 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
źródło
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
i wtedy
pracowałbym.
źródło
Możesz rzucić okiem na kod źródłowy .
DataFrame
ma funkcję prywatną_slice()
do wycinaniaDataFrame
i pozwala parametrowiaxis
określić, którą oś należy wyciąć.__getitem__()
NaDataFrame
nie 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:
źródło
możesz przechodzić przez ramkę danych w ten sposób.
źródło