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