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?

cs95
źródło
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)

Jeff
źródło
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.

Ted Petrou
źródło
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

HYRY
źródło
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.

Pavel Prochazka
źródło
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)
waitingkuo
źródło
5

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

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
użytkownik1401491
źródło