Добавление новой строки в последнюю строку каждой группы в фрейме данных

Мой исходный фрейм данных выглядит следующим образом:

List = [['2024-05-25', 'Group 1', 'Year 1', 23466882], ['2024-05-25', 'Group 1', 'Year 2', 458397284], ['2024-05-25', 'Group 1', 'Year 3', 2344545], ['2024-05-25', 'Group 2', 'Year 1', 6662345], ['2024-05-25', 'Group 2', 'Year 2', 46342], ['2024-05-25', 'Group 3', 'Year 1', 34234], ['2024-05-25', 'Group 3', 'Year 2', 45222]]
df = pd.DataFrame(List, columns = ['Report_date', 'Product_group', 'Year', 'Sales'])

Для каждой группы товаров, если «Год 3» не существует, в конец следует добавить новую строку с объемом продаж 11 000.

Вывод должен выглядеть так:

Моя первоначальная идея состоит в том, чтобы разделить фрейм данных на каждую группу продуктов и добавить новую строку, если в подфрейме данных нет никакой информации за год 3, но этот подход не кажется оптимальным.

Любой комментарий приветствуется. Заранее спасибо!

Дата отчета всегда одна и та же?

jezrael 28.06.2024 13:03

Вам нужны одинаковые годы для каждой группы, как решения в дублях?

jezrael 28.06.2024 13:04

Большое спасибо: D решение ниже точно такое же, как я ожидаю.

Laura 28.06.2024 13:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если нужно добавить только отсутствующий год Year 3 для каждой группы, используйте pd.concat с отфильтрованными строками с первыми несуществующими группами с добавленными новыми значениями Year и Sales:

Примечание. Это решение добавляет только новые строки для несуществующих Year 3, а также работает, если они не существуют в те же годы для любой группы. Например. если удалить первую строку, то Year 1 отсутствует.

g = df.loc[df['Year'].eq('Year 3'), 'Product_group']

out = (pd.concat([df, 
                  df.loc[~df['Product_group'].isin(g)]
                    .drop_duplicates('Product_group').assign(Year='Year 3', Sales=11000)])
          .sort_values(['Product_group','Year'], ignore_index=True))
print (out)
  Report_date Product_group    Year      Sales
0  2024-05-25       Group 1  Year 1   23466882
1  2024-05-25       Group 1  Year 2  458397284
2  2024-05-25       Group 1  Year 3    2344545
3  2024-05-25       Group 2  Year 1    6662345
4  2024-05-25       Group 2  Year 2      46342
5  2024-05-25       Group 2  Year 3      11000
6  2024-05-25       Group 3  Year 1      34234
7  2024-05-25       Group 3  Year 2      45222
8  2024-05-25       Group 3  Year 3      11000

Другие вопросы по теме