Как удалить строку с определенным индексом в каждой группе в объекте GroupBy?

#python #pandas #dataframe #pandas-groupby

#python #панды #фрейм данных #pandas-groupby

Вопрос:

Я пытаюсь удалить строку с определенным индексом в каждой группе внутри объекта GroupBy.

Лучшее, что я смог сделать, это:

 import pandas as pd
    
x_train = x_train.groupby('ID')
x_train.apply(lambda x: x.drop([0], axis=0))
  

Однако это не работает. Я потратил целый день на это без решения, поэтому обратился к stack.

Редактировать: также необходимо решение для любого значения индекса

Комментарии:

1. Я безрезультатно проверил 47 сообщений стека, поверьте мне, когда я говорю, что это не дубликат

Ответ №1:

Вы можете сделать это с cumcount

 idx= x_train.groupby('ID').cumcount()
x_train = x_train[idx!=0]
  

Комментарии:

1. Большое вам спасибо. Я потратил на это почти целый день. Я вечно благодарен вам

2. просто еще один вопрос, как я могу использовать этот подход для любого индекса?

3. @AayushPanda если вам нужно удалить 1, просто выполните x_train[idx!=1], если оба 1 и 0, x_train[~idx.isin([0,1])]

4. но как мне сделать последнюю, если у каждого df разное количество строк?

5. @AayushPanda idx= x_train.groupby(‘ID’).cumcount(по возрастанию = False), затем x_train = x_train[idx!= 0], это изменит порядок подсчета ~ 🙂

Ответ №2:

Проблема с использованием drop внутри groupby в том, что номера индексов остаются такими же, как и до groupby . Поэтому при использовании drop([0]) будет удалена только та строка, которая изначально имела 0 индекс. В других группах не будет ни одной строки с индексом 0 , если индекс уникален.

Если вы хотите использовать drop , то, что вы можете сделать, это сначала использовать reset_index внутри сгруппированных данных:

 x_train.groupby('ID').apply(lambda x: x.reset_index().drop([0]))