Как агрегировать и вставлять записи в фрейм данных в зависимости от условия? - PullRequest
0 голосов
/ 24 февраля 2020
   COUNTRY   DATE         COMPANY   ITEM    SALES
0  TAIWAN   01-02-2019    CHINAM    TOY      2500
1  TAIWAN   05-02-2019    CHINAM    TOY      2500
2  TAIWAN   26-02-2019    CHINAM    TOY      2500
3  TAIWAN   01-02-2019    CHINAM    CERAMIC  500
4  TAIWAN   05-02-2019    CHINAM    CERAMIC  5500
5  TAIWAN   26-02-2019    CHINAM    CERAMIC  6500
6  TAIWAN   01-02-2019    CHINAM    KITCHEN  4500
7  TAIWAN   05-02-2019    CHINAM    KITCHEN  4500
8  TAIWAN   26-02-2019    CHINAM    KITCHEN  2300

Мне НУЖНО СОГЛАСОВАТЬ ДАННЫЕ, ОСНОВАННЫЕ НА НЕКОТОРЫХ УСЛОВИЯХ: ЕСЛИ ПОСЛЕДНИЙ ДЕНЬ МЕСЯЦА В РАМКАХ ДАННЫХ МЕНЬШЕ, ЧЕМ НАСТОЯЩИЙ ПОСЛЕДНИЙ ДЕНЬ МЕСЯЦА, т.е. ДАННЫЕ НА УРОВНЕ ПУНКТА И ВСТАВЬТЕ, ЧТО ЗАПИСЫВАЕТСЯ В СФЕРЕ ДАННЫХ.

ПРЕДЛОЖЕНИЕ В МОЕМ DF ПОСЛЕДНЯЯ ДАТА 26-02-2019, НО РЕАЛЬНЫЙ КАЛЕНДАРЬ ПОСЛЕДНЯЯ ДАТА 28-02-2019. В ЭТОМ СОСТОЯНИИ Я ДОЛЖЕН АГРЕГИРОВАТЬ УРОВЕНЬ «ПУНКТ» И ВСТАВИТЬ ЗАПИСЬ В DF, ЧТО-ТО НИЧЕГО НЕ ДЕЛАТЬ.

ВЫХОД:

   COUNTRY   DATE         COMPANY   ITEM    SALES
0  TAIWAN   01-02-2019    CHINAM    TOY      2500
1  TAIWAN   05-02-2019    CHINAM    TOY      2500
2  TAIWAN   26-02-2019    CHINAM    TOY      2500
3  TAIWAN   01-02-2019    CHINAM    CERAMIC  500
4  TAIWAN   05-02-2019    CHINAM    CERAMIC  5500
5  TAIWAN   26-02-2019    CHINAM    CERAMIC  6500
6  TAIWAN   01-02-2019    CHINAM    KITCHEN  4500
7  TAIWAN   05-02-2019    CHINAM    KITCHEN  4500
8  TAIWAN   26-02-2019    CHINAM    KITCHEN  2300
9  TAIWAN   01-02-2019    CHINAM    TOY      7500
10 TAIWAN   05-02-2019    CHINAM    CERAMIC  12500
11 TAIWAN   05-02-2019    CHINAM    KITCHEN  11300

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

IIU C,

df_sums = (df.groupby(['COUNTRY', 'COMPANY', 'ITEM'])[['DATE','SALES']]
             .agg(DATE=('DATE', lambda x: x.iloc[-1] + pd.Timedelta(days=7)),
                  SALES=('SALES', 'sum')).reset_index())

pd.concat([df, df_sums])

Выход:

  COUNTRY       DATE COMPANY     ITEM  SALES
0  TAIWAN 2019-01-02  CHINAM      TOY   2500
1  TAIWAN 2019-05-02  CHINAM      TOY   2500
2  TAIWAN 2019-02-26  CHINAM      TOY   2500
3  TAIWAN 2019-01-02  CHINAM  CERAMIC    500
4  TAIWAN 2019-05-02  CHINAM  CERAMIC   5500
5  TAIWAN 2019-02-26  CHINAM  CERAMIC   6500
6  TAIWAN 2019-01-02  CHINAM  KITCHEN   4500
7  TAIWAN 2019-05-02  CHINAM  KITCHEN   4500
8  TAIWAN 2019-02-26  CHINAM  KITCHEN   2300
0  TAIWAN 2019-03-05  CHINAM  CERAMIC  12500
1  TAIWAN 2019-03-05  CHINAM  KITCHEN  11300
2  TAIWAN 2019-03-05  CHINAM      TOY   7500
0 голосов
/ 24 февраля 2020

Моя первая мысль (при условии, что это решение будет использоваться несколько лет, чтобы вы не могли просто группировать по месяцам) разбить дату на три столбца: месяц, день, год. Затем что-то вроде этой группы по:

df.groupby(["month", "year"]).agg({ITEM: lambda x: np.nan if is_last_day(x["day"].max(), x["month"], x["year"]) else aggregating_method(x["ITEM"]) } )

Где метод is_last_day можно было бы сделать хорошо с методами даты и времени, а метод агрегирования, однако, вы хотите агрегировать. Извините, если код не работает точно, так как я не смог его протестировать, но, надеюсь, он дает представление о мыслительном процессе. Дайте мне знать, если у вас есть какие-либо другие вопросы или я полностью неправильно понял ваш вопрос. Удачи!

...