Как я могу сгруппировать данные, но генерировать динамические c столбцы? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть таблица данных, которая содержит что-то вроде ниже (но, естественно, гораздо больше строк).

edit: каждая строка ниже представляет собой отдельную «покупку» количества, действительного для диапазона дат. Я пытаюсь определить общее количество по КОДУ.

+------+------------+-----------+----------+
| CODE | START DATE | END DATE  | QUANTITY |
+------+------------+-----------+----------+
| AAA  | 01-Dec-19  | 15-Dec-19 |      555 |
| BBB  | 01-Dec-19  | 15-Dec-19 |      666 |
| AAA  | 01-Dec-19  | 15-Jan-20 |      100 |
| BBB  | 01-Dec-19  | 15-Jan-20 |      111 |
| AAA  | 01-Dec-19  | 15-Feb-21 |      200 |
| BBB  | 01-Dec-19  | 15-Feb-21 |      222 |
+------+------------+-----------+----------+

Я пытаюсь написать код Python / Pandas, который будет вычислять общее количество по каждому коду на месяц. Вывод должен выглядеть примерно так.

Итак, до 01 декабря c 2019 у нас ничего не было в книгах и, следовательно, нулевые итоги. Но в конце De c 2019 у нас было 100 + 200 AAA и 111 + 222 BBB.

Тем не менее, в конце января 2020 года 100 AAA и 111 BBB оба «созрели», и у нас осталось только 200 и 222 соответственно.

+------+-----------+-----------+-----------+-----------+---+-----------+
| CODE | 30-Nov-19 | 31-Dec-19 | 31-Jan-20 | 28-Feb-20 | … | 28-Feb-21 |
+------+-----------+-----------+-----------+-----------+---+-----------+
| AAA  |         0 |       300 |       200 |       200 | … |         0 |
| BBB  |         0 |       333 |       222 |       222 | … |         0 |
+------+-----------+-----------+-----------+-----------+---+-----------+

1 Ответ

1 голос
/ 03 февраля 2020

Я предлагаю следующее:

  • Определить список dates дат, которые вы хотите в качестве столбцов в конечном результате.
  • Напишите функцию my_func, которая принимает группа кодов DF и dates.
    • my_func вернет Серию (возможно, это должен быть DataFrame из 1 столбца, не помню) с датами в качестве индекса. Для каждой даты d она фильтрует строки группы CODE, где d находится между START и END DATE, и суммирует количества.
  • Тогда вы можете df.groupby('code').apply(my_func, dates).unstack() что должно привести к желаемому результату.

Если вы предоставите свой пример в виде Python кода, кто-то может на самом деле кодировать ответ для вас.

...