Ответ 1
Чтобы удалить последние n строк:
df.drop(df.tail(n).index,inplace=True) # drop last n rows
В том же ключе вы можете удалить первые n строк:
df.drop(df.head(n).index,inplace=True) # drop first n rows
Я думаю, что это должно быть просто, но я попробовал несколько идей, и никто из них не работал:
last_row = len(DF)
DF = DF.drop(DF.index[last_row]) #<-- fail!
Я пытался использовать отрицательные индексы, но это также приводило к ошибкам. Я все еще должен недопонимать что-то основное.
Спасибо заранее.
Чтобы удалить последние n строк:
df.drop(df.tail(n).index,inplace=True) # drop last n rows
В том же ключе вы можете удалить первые n строк:
df.drop(df.head(n).index,inplace=True) # drop first n rows
Поскольку позиционирование индекса в Python основано на 0, на самом деле не будет элемента в index
в местоположении, соответствующем len(DF)
. Это вам нужно 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]
Однако гораздо проще просто написать DF[:-1]
.
DF[:-n]
где n - это последнее число строк, которые нужно удалить.
Чтобы удалить последнюю строку:
DF = DF[:-1]
stats = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv")
Вывод статистики:
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
просто используйте skipfooter=1
skipfooter: int, default 0
Количество строк в нижней части файла, чтобы пропустить
stats_2 = pd.read_csv("C:\\py\\programs\\second pandas\\ex.csv", skipfooter=1, engine='python')
Вывод stats_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
drop возвращает новый массив, поэтому он захлебнулся в сообщении og; У меня было похожее требование переименовать некоторые заголовки столбцов и удалить некоторые строки из-за плохо сформированного CSV файла, преобразованного в Dataframe, поэтому после прочтения этого поста я использовал:
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)
и он работал отлично, как вы можете видеть с двумя закомментированными строками выше, я попробовал метод drop.(), и он работает, но не так kool и удобочитаем, как при использовании [n: -n], надеюсь, это кому-то поможет, спасибо.
Удивлен, никто не поднял этот вопрос:
# To remove last n rows
df.head(-n)
# To remove first n rows
df.tail(-n)
Выполнение теста скорости в DataFrame из 1000 строк показывает, что нарезка и head
/tail
примерно в 6 раз быстрее, чем при использовании 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)