Wybieranie wiersza serii/ramki danych według indeksu liczb całkowitych

Jestem ciekaw dlaczego df[2] nie jest obsługiwane, 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 df[2] będzie działać tak samo jak df[2:3] i będzie zgodne z konwencją indeksowania Pythona. Czy istnieje projektowy powód, aby nie wspierać indeksowania wiersza przez pojedynczą liczbę całkowitą?

Author: coldspeed, 2013-04-19

6 answers

Echoing @ HYRY, Zobacz nowe dokumenty w 0.11

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

Tutaj mamy nowe operatory, .iloc to explicity obsługuje tylko indeksowanie liczb całkowitych, a .loc to explicity obsługuje 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

[] plastry wierszy (według lokalizacji etykiety) tylko

 378
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 12:40:37

Głównym celem operatora indeksującego ramki danych, [] jest wybieranie kolumn.

Gdy operator indeksujący przekazuje ciąg znaków 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] wyszukuje nazwę kolumny pasującą do liczby całkowitej 2. Ta kolumna nie istnieje i KeyError jest podniesiona.


Operator indeksowania ramki danych całkowicie zmienia zachowanie, aby wybrać wiersze, gdy slice notation is used

O dziwo, gdy podano wycinek, operator indeksujący ramki danych wybiera wiersze i może to zrobić przez lokalizację całkowitą lub przez etykietę indeksu.

df[2:3]

Spowoduje przecięcie od wiersza z liczbą całkowitą 2 do 3, z wyłączeniem ostatniego elementu. Więc, tylko jeden rząd. Poniższy wybór wierszy rozpoczynających się od miejsca integer 6 do 20, ale nie włączając w to 20, co trzeci wiersz.

df[6:20:3]

Możesz również użyć plastrów składających się z etykiet sznurkowych, jeśli twój DataFrame index zawiera ciągi znaków. Aby uzyskać więcej informacji, zobacz To rozwiązanie na .iloc vs .loc .

Prawie nigdy nie używam tej notacji slice z operatorem indeksującym, ponieważ nie jest jednoznaczna i prawie nigdy nie jest używana. Przy krojeniu rzędami należy trzymać .loc/.iloc.

 24
Author: Ted Petrou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-05 19:41:40

DataFrame można traktować jako dict serii. df[key] spróbuj wybrać indeks kolumny przez key i Zwróć obiekt Series.

Jednak krojenie wewnątrz [] kroi wiersze, ponieważ jest to bardzo powszechna operacja.

Możesz przeczytać dokument dla szczegółów:

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

 19
Author: HYRY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-19 07:33:32

Aby indeksować dostęp do tabeli pandy, można również rozważyć numpy. as_array opcję przekonwertowania tabeli na tablicę Numpy jako

np_df = df.as_matrix()

A następnie

np_df[i] 
Zadziałałoby.
 10
Author: Pavel Prochazka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 06:53:06

Możesz zapętlić ramkę danych w ten sposób .

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
 5
Author: user1401491,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 10:56:04

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

DataFrame posiada prywatną funkcję {[2] } do wycinania DataFrame i pozwala parametrowi axis określić, która oś ma przecinać. __getitem__() dla DataFrame nie ustawia osi podczas wywoływania _slice(). Tak więc _slice() przeciąć ją domyślną osią 0.

Możesz zrobić 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)
 4
Author: waitingkuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-19 10:47:25