Як видалити останній рядок даних фрейму даних pandas


104

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

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

Я намагався використовувати негативні індекси, але це також призводить до помилок. Напевно, я все ще не розумію чогось елементарного.


27
DF = DF[:-1]?
U2EF1

@ U2EF1 це копіює весь набір даних, чи не так? При обробці величезних даних це може бути проблемою.
ManuelSchneid3r

Відповіді:


163

Щоб відпустити останні 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], ось = 1, inplace = True) або, якщо ви знаєте назву стовпця, ви можете використовувати df.drop (columns = ['col_name '], inplace = True) - якщо ви не хочете, щоб це виконувалося на місці, призначте його новій змінній і видаліть цей аргумент.
Шон Шрейер

78
DF[:-n]

де n - остання кількість рядків, які потрібно скинути.

Щоб скинути останній рядок:

DF = DF[:-1]

58

Оскільки позиціонування індексу в 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?
Філіпп

21

Здивований, цього ніхто не виховував:

# 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()Насправді змінює уявлення в пам'яті (або модифікації INPLACE, або створює абсолютно нову dataframe). Я не шукав цього в документах, хтось, будь ласка. (якщо це різниця: гарне пояснення для 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')

Вихід статистики_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

Для більш складних фреймів даних, які мають мультиіндекс (скажімо "Запас" та "Дата"), і один хоче видалити останній рядок для кожного запасу, а не лише останній рядок останнього запасу, тоді рішення говорить:

# 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 зберігає той самий тип мультиіндексу, що і до операції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.