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ą?
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
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
.
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
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.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])
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)
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