#python #pandas #pandas-groupby
#python #pandas #pandas-groupby
Вопрос:
Я пытаюсь получить наименьшее значение из столбца «Дата начала назначения» на основе «Номер сотрудника» и «Название группы клиентов» в столбец с именем «начало».
Я хочу, чтобы столбец «начало» был заполнен минимальной «Датой начала назначения» для каждого «Имени группы клиентов» и каждого «Номера сотрудника».
На данный момент я написал приведенный ниже код:
for i, j in test_n.iterrows():
l = test_n.iloc[i]['Employee no']
test_n['start'] = test_n['Assignment Start Date'].where(test_n['Employee no'] == l).groupby(test_n['Client Group Name_y']).transform('min')
Этот код работает нормально и генерирует желаемый результат. Но он перезаписывает предыдущие записи значениями NaN. Это работает только для последнего ‘Employee no’. Я хочу, чтобы это работало для всех ‘Employee no’ без создания других столбцов NaN.
Как мне остановить это, чтобы я получал минимальные значения для всех строк?
Ответ №1:
Попробуйте эту строку кода, касающуюся test_n
dfc = test_n.groupby(['Employee no','Client Group Name_y'])['Assignment Start Date']
test_n = test_n.assign(start=dfc.transform(min))
test_n
Ответ №2:
Похоже, вы пытаетесь выполнить итерацию по каждой строке во фрейме данных и заменять значения по одному за раз. Это не очень эффективно и может привести к ошибкам. Альтернативным методом было бы использование метода Groupby. Group by создает группы в заданных столбцах, после чего вы можете применять другие методы к каждой группе.
Чтобы использовать это, вам сначала нужно создать группы, по которым вы хотите понимать данные, и выбрать данные, по которым вы хотите найти min.
test_n_groups = test_n.groupby(by=['Employee no','Client Group Name_y'])['Assignment Start Date']
Затем вы могли бы использовать несколько методов вместе, чтобы добавить минимум в качестве нового столбца к вашему исходному фрейму данных.
Сначала вы должны применить метод преобразования к сгруппированным данным, чтобы получить столбец с минимальной начальной датой для каждой строки
min_group = test_n_groups.transform(min)
Затем вы должны применить метод assign к исходному фрейму данных, используя свои группы с именем start и преобразование для минимального значения из вашей группы
test_n.assign(start=min_group)
Наконец, я бы распечатал фрейм данных, чтобы посмотреть, как он выглядит
test_n.head(15)