Como deletar a última linha de dados de um dataframe pandas

104

Acho que deve ser simples, mas tentei algumas idéias e nenhuma delas funcionou:

last_row = len(DF)
DF = DF.drop(DF.index[last_row])  #<-- fail!

Tentei usar índices negativos, mas isso também levou a erros. Devo ainda estar entendendo mal algo básico.

tumultous_rooster
fonte
27
DF = DF[:-1]?
U2EF1
@ U2EF1 isso copia todo o conjunto de dados, não é? Ao lidar com dados enormes, isso pode ser um problema.
ManuelSchneid3r

Respostas:

163

Para eliminar as últimas n linhas:

df.drop(df.tail(n).index,inplace=True) # drop last n rows

Na mesma linha, você pode descartar as primeiras n linhas:

df.drop(df.head(n).index,inplace=True) # drop first n rows
Kane Chew
fonte
Para eliminar a última coluna, você pode usar df.drop (df.columns [-1], axis = 1, inplace = True) ou, se você souber o nome da coluna, pode usar df.drop (colunas = ['col_name '], inplace = True) - se você não quiser que seja executado no local, atribua-o a uma nova variável e remova esse argumento.
Shawn Schreier
78
DF[:-n]

onde n é o último número de linhas a serem eliminadas.

Para soltar a última linha:

DF = DF[:-1]
céu azul
fonte
58

Como o posicionamento do índice em Python é baseado em 0, não haverá realmente um elemento no indexlocal correspondente a len(DF). Você precisa que seja last_row = len(DF) - 1:

In [49]: dfrm
Out[49]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723
9  0.834706  0.002989  0.333436

[10 rows x 3 columns]

In [50]: dfrm.drop(dfrm.index[len(dfrm)-1])
Out[50]: 
          A         B         C
0  0.120064  0.785538  0.465853
1  0.431655  0.436866  0.640136
2  0.445904  0.311565  0.934073
3  0.981609  0.695210  0.911697
4  0.008632  0.629269  0.226454
5  0.577577  0.467475  0.510031
6  0.580909  0.232846  0.271254
7  0.696596  0.362825  0.556433
8  0.738912  0.932779  0.029723

[9 rows x 3 columns]

No entanto, é muito mais simples apenas escrever DF[:-1].

ely
fonte
2
Observe que ao eliminar usando dfrm.index, o índice da última linha deve ser exclusivo, caso contrário, todas as linhas com esse índice são eliminadas.
FranciscoD
Eu entendi corretamente que usando drop (inplace = True) você modifica o df existente, enquanto usando df [: - 1] você obtém uma visão dos dados, que mais tarde pode levar a SettingWithCopyWarning?
Philipp
21

Surpreso que ninguém mencionou este:

# To remove last n rows
df.head(-n)

# To remove first n rows
df.tail(-n)

A execução de um teste de velocidade em um DataFrame de 1000 linhas mostra que fatiar e head/ tailsão cerca de 6 vezes mais rápido do que usar drop:

>>> %timeit df[:-1]
125 µs ± 132 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.head(-1)
129 µs ± 1.18 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

>>> %timeit df.drop(df.tail(1).index)
751 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
theGirrafish
fonte
Talvez a diferença entre ambas as abordagens é que head()e tail()criar uma vista enquanto que drop()realmente muda a representação na memória (ou modificação inplace, ou cria uma inteiramente nova trama de dados). Eu não pesquisei isso nos documentos, alguém, por favor, consulte. (se essa for a diferença: boa explicação para a diferença de desempenho, e é preciso escolher cuidadosamente entre elas) /
Dr. Jan-Philip Gehrcke
@ Dr.Jan-PhilipGehrcke Head head, taile droptodos retornam uma visão, embora seja verdade que dropdá a você a opção de modificar o dataframe original no local.
theGirrafish,
5
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")

O resultado das estatísticas:

       A            B          C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
9   0.834706    0.002989    0.333436

Apenas use skipfooter=1

skipfooter: int, padrão 0

Número de linhas na parte inferior do arquivo para pular

stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')

Saída de estatísticas_2

       A          B            C
0   0.120064    0.785538    0.465853
1   0.431655    0.436866    0.640136
2   0.445904    0.311565    0.934073
3   0.981609    0.695210    0.911697
4   0.008632    0.629269    0.226454
5   0.577577    0.467475    0.510031
6   0.580909    0.232846    0.271254
7   0.696596    0.362825    0.556433
8   0.738912    0.932779    0.029723
Riz.Khan
fonte
1

drop retorna um novo array, então é por isso que ele engasgou no post og; Tive um requisito semelhante para renomear alguns cabeçalhos de coluna e excluir algumas linhas devido a um arquivo csv malformado convertido para Dataframe, então, depois de ler este post, usei:

newList = pd.DataFrame(newList)
newList.columns = ['Area', 'Price']
print(newList)
# newList = newList.drop(0)
# newList = newList.drop(len(newList))
newList = newList[1:-1]
print(newList)

e funcionou muito bem, como você pode ver com as duas linhas comentadas acima, tentei o método drop. () e funcionou, mas não tão bom e legível quanto usar [n: -n], espero que ajude alguém, obrigado.

Horário nobre
fonte
0

Para DataFrames mais complexos que têm um índice múltiplo (digamos "Estoque" e "Data") e se deseja remover a última linha de cada Estoque, não apenas a última linha do último Estoque, a solução é:

# To remove last n rows
df = df.groupby(level='Stock').apply(lambda x: x.head(-1)).reset_index(0, drop=True)

# To remove first n rows
df = df.groupby(level='Stock').apply(lambda x: x.tail(-1)).reset_index(0, drop=True)

Como o groupby()está adicionando um nível adicional ao Multi-índice, simplesmente o soltamos no final usando reset_index(). O df resultante mantém o mesmo tipo de índice múltiplo de antes da operação.

Dorian B.
fonte