Объединение многоиндексных панд приведет к единому индексу для добавления недостающих строк

#python #pandas

Вопрос:

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

 current_month = pd.pivot_table(df1['Report Name'], columns='Status of Report', values='Status Count, dropna=False, fill_value=0)


pivot table example (sorry for formatting):  
Status of Report | Ignore Report | Good Report | Critical Report 
Report Name
UK               |       1       |      5      |       1
France           |       4       |      2      |       0
Germany          |       2       |      1      |       0
Italy            |       2       |      2      |       0
 

Теперь, если бы вообще не было отчетов, скажем, по Бельгии, как бы я мог добавить строку, в которой были все нули? Я попытался создать фрейм данных отчета, в котором перечислены все страны, а затем попытался объединить сводную таблицу с all_reports_df, но я постоянно получаю ошибки

 all_reports = {'Report Name': ['UK', 'France', 'Germany', 'Italy', 'Belgium']}
all_reports_df = pd.Dataframe(all_reports)
all_reports_df.join(current_month, on='Report Name', how='left')
 

Это соединение не вносит изменений в all_reports_df. Любая помощь была бы очень признательна

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

1. Ваш вопрос решен? если это так, то попробуйте рассмотреть возможность принятия , чтобы сообщить другим, что проблема решена. Если нет, вы можете предоставить обратную связь, чтобы ответ можно было улучшить (или вообще удалить).

Ответ №1:

попробуйте через reindex() :

 df=(df.set_index('Status of Report')
      .reindex(['UK', 'France', 'Germany', 'Italy', 'Belgium'])
      .reset_index()
      .fillna(df).fillna(0))
 

или

Если есть только 1 запись, то вы можете попробовать:

 df.loc[len(df)]=['Belgium',0,0,0]
 

или

через merge() :

 all_reports = {'Status of Report': ['UK', 'France', 'Germany', 'Italy', 'Belgium']}
all_reports_df = pd.DataFrame(all_reports)
df=all_reports_df.merge(df,how='left').fillna(df).fillna(0)