Estou tentando selecionar linhas de um DataFrame do Pandas, usando valores de índice inteiro.
Isso não funciona e obtenho erros de índice.
- Isso me sugere que realizar uma seleção de linhas por índice faz com que
reset_index()
seja chamado implicitamente, embora eu possa estar enganado - O exemplo a seguir explica por que o comportamento que observo sugere que esse seja o caso
import pandas
data = {
'number': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'fruit': 3 * ['apple'] + 3 * ['pear'] + 2 * ['banana'] + ['pear'] + ['apple'],
'color': 3 * ['red', 'green', 'blue'] + ['red'],
'letter': 5 * ['A', 'B'],
}
df = pandas.DataFrame(data)
df
df_selected = df[df['fruit'] == 'pear']
df_selected
df_selected.index
Index([3, 4, 5, 8], dtype='int64')
Isto certamente sugere que tenho um DataFrame com um índice contendo os valores 3, 4, 5 e 8.
Agora quero selecionar todas as linhas no DataFrame desde a primeira ocorrência de 'pear' até a última ocorrência, usando o índice inteiro :
Achei que isso deveria ser possível com a seguinte sintaxe:
FIRST = 3
LAST = 8
df_selected[FIRST:LAST+1]
Mas estou enganado:
- Ao imprimir (exibindo o DataFrame
stdout
ou uma célula do Jupyter Notebook), o índice mostra valores3, 4, 5, 8
. - Ao selecionar por índice usando a sintaxe
df_selected[A:B]
oudf_selected.iloc[A:B]
os argumentos inteirosA
eB
são interpretados como sedf_selected.reset_index()
tivessem sido chamados - Digo isso porque a chamada
reset_index()
produz a seguinte saída
O que implica que o intervalo correto a ser usado ao selecionar por índice édf_selected.iloc[0:3+1]
Estou ciente de que esta é uma pergunta incrivelmente básica, mas espero que alguém possa me indicar a direção certa para entender por que o comportamento é assim, se houver uma razão específica para isso.
Você deve usar
loc
para selecionar por rótulo:Ou:
Nota. como
loc
inclui ambas as extremidades, você não precisa do+1
.Saída:
Ao usar
df_selected[1:2]
, isso se comporta comoiloc
e seleciona da quarta à nona posição (apenas a linha com label8
).alternativa
Se o seu objetivo é selecionar todos os valores entre a primeira e a última correspondência, você também pode usar a indexação booleana :
Como funciona: