Как удалить последнюю строку данных фрейма данных pandas

108

Я думаю, это должно быть просто, но я попробовал несколько идей, и ни одна из них не сработала:

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

Я пробовал использовать отрицательные индексы, но это тоже приводило к ошибкам. Я, должно быть, все еще неправильно понимаю что-то основное.

tumultous_rooster
источник
27
DF = DF[:-1]?
U2EF1
@ U2EF1 это копирует весь набор данных, не так ли? Это может быть проблемой при обработке огромных данных.
ManuelSchneid3r

Ответы:

166

Чтобы удалить последние 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
Кейн Чу
источник
Чтобы удалить последний столбец, вы можете использовать df.drop (df.columns [-1], axis = 1, inplace = True) или, если вы знаете имя столбца, вы можете использовать df.drop (columns = ['col_name '], inplace = True) - если вы не хотите, чтобы это выполнялось на месте, назначьте его новой переменной и удалите этот аргумент.
Шон Шрайер,
81
DF[:-n]

где n - последнее число отбрасываемых строк.

Чтобы удалить последнюю строку:

DF = DF[:-1]
голубое небо
источник
59

Поскольку позиционирование индекса в 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].

Эли
источник
2
Обратите внимание, что при отбрасывании с использованием dfrm.index индекс последней строки должен быть уникальным, в противном случае удаляются все строки с этим индексом.
FranciscoD
Правильно ли я понимаю, что с помощью drop (inplace = True) вы изменяете существующий df, а при использовании df [: - 1] вы получаете представление данных, которое позже может привести к SettingWithCopyWarning?
Филипп
22

Удивлен, что никто не поднял этот вопрос:

# 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)
морская рыба
источник
Возможно, разница между обоими подходами заключается в том, что head()и tail()создают представление, тогда как на drop()самом деле изменяет представление в памяти (либо модификация на месте, либо создает полностью новый фрейм данных). Я не искал это в документации, кто-нибудь, пожалуйста. (если это разница: хорошее объяснение для perf diff, и нужно тщательно выбирать между ними) /
д-р Ян-Филип Герке
@ Dr.Jan-PhilipGehrcke Head head, tailи dropвсе они возвращают представление, хотя это правда, что dropдает вам возможность изменить исходный фрейм данных на месте.
theGirrafish
5
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, по умолчанию 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
Риз.Хан
источник
1

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. (), и он работает, но не так круто и читабельно, как при использовании [n: -n], надеюсь, это кому-то поможет, спасибо.

ПРАЙМ-тайм
источник
0

Для более сложных DataFrames, которые имеют мультииндекс (скажем, «Акция» и «Дата»), и нужно удалить последнюю строку для каждой Акции, а не только последнюю строку последней Акции, тогда решение гласит:

# 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)

Поскольку groupby()он добавляет дополнительный уровень к мультииндексу, мы просто опускаем его в конце использования reset_index(). Результирующий df сохраняет тот же тип мультииндекса, что и до операции.

Дориан Б.
источник