Python pandas — Groupby Условное количество значений ячеек

#python #conditional-statements #pandas-groupby #counting

#python #условные операторы #pandas-groupby #подсчет

Вопрос:

У меня есть таблица, которая содержит список идентификаторов посылок, время их отправления, время прибытия и тип или посылку.

Ниже приведен минимальный рабочий пример, иллюстрирующий таблицу.

Для каждой строки я пытаюсь получить количество посылок аналогичного типа (например, TV или PC), время отправления которых превышает или равно [времени отправления рассматриваемой строки] и строго уступает [времени прибытия рассматриваемой строки]

Пример входных данных

 Parcel_id, departure_time, arrival_time, type
id_1, 07:00, 07:30, TV
id_2, 07:00, 07:15, PC
id_3, 07:05, 07:22, PC
id_4, 07:10, 07:45, TV
id_5, 07:15, 07:50, TV
id_6, 07:10, 07:26, PC
id_7, 07:40, 08:10, TV
id_8, 07:14, 07:46, TV
id_9, 07:14, 07:32, PC
id_10, 07:15, 07:30, PC
  

Пример желаемых выходных данных

 Parcel_id, departure_time, arrival_time, type, number_of_parcels
id_1, 07:00, 07:30, TV, 4
id_2, 07:00, 07:15, PC, 4
id_3, 07:05, 07:22, PC, 4
id_4, 07:10, 07:45, TV, 4
id_5, 07:15, 07:50, TV, 2
id_6, 07:10, 07:26, PC, 3
id_7, 07:40, 08:10, TV, 1
id_8, 07:14, 07:46, TV, 3
id_9, 07:14, 07:32, PC, 2
id_10, 07:15, 07:30, PC, 1
  

Я пытаюсь использовать функцию groupby, а затем применить условия …. без какого-либо успеха

 table['number_of_parcels']= table.groupby(['type']).cond.apply(lambda g: (g>=table['departure`_time'] amp; g<table['arrival_time'])).count()
  

У кого-нибудь есть идеи о том, как это взломать?

Большое спасибо

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

1. Привет, Майкл, для id_1 у меня есть 4 строки, удовлетворяющие условию: id_1, id_4, id_5, id_8, поскольку время их отправления соответственно 07:00, 07:10, 07:15, 07:14 который >= 07:00 и <07:30

2. для id_2 строки, удовлетворяющие условиям, являются id_2, id_3, id_6, id_9. Я забыл упомянуть, что я хочу рассматривать только посылки похожих типов (я обновляю его в первоначальном вопросе). Смог ли я уточнить свой запрос?

3. да, вы правы, извините за ошибку

Ответ №1:

Это работает

 df['number_of_parcels'] = df.groupby('type').apply(lambda x: x.apply(lambda y:(
    (x['departure_time'] >= y['departure_time']) amp; (x['departure_time'] < y['arrival_time'])
    ).sum(), axis=1)).droplevel(level=0)
df
  

Выход:

   Parcel_id departure_time arrival_time type  number_of_parcels
0      id_1          07:00        07:30   TV                  4
1      id_2          07:00        07:15   PC                  4
2      id_3          07:05        07:22   PC                  4
3      id_4          07:10        07:45   TV                  4
4      id_5          07:15        07:50   TV                  2
5      id_6          07:10        07:26   PC                  3
6      id_7          07:40        08:10   TV                  1
7      id_8          07:14        07:46   TV                  3
8      id_9          07:14        07:32   PC                  2
9     id_10          07:15        07:30   PC                  1
  

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

1. Большое вам спасибо как за руку, так и за супер быструю помощь 🙂 Кроме того, я также обнаруживаю функцию droplevel, я прочитаю документацию об этом