如何在Pandas多索引中为指定组合插入缺失月份行
解决方案
方法一:交叉连接(Cross Merge)
这种方法直观易懂,先提取原数据中存在的有效utility-state组合,再和所有月份做交叉连接补全缺失行:
import pandas as pd # 原数据 df = pd.DataFrame({'year':[23,23,23,23,23,23], 'month':[1,1,1,2,3,3], 'utility':['A','A','B','A','A','B'], 'state':['NY','NJ','CA','NJ','NY','CA']}) # 1. 提取原数据中唯一的utility-state组合 unique_pairs = df[['utility', 'state']].drop_duplicates() # 2. 获取所有需要覆盖的月份(自动提取并排序) all_months = pd.DataFrame({'month': df['month'].unique().sort()}) # 3. 交叉连接生成完整框架,补全固定的year列 full_df = unique_pairs.merge(all_months, how='cross') full_df['year'] = 23 # 4. 调整列顺序并排序,匹配目标格式 full_df = full_df[['year', 'month', 'utility', 'state']].sort_values(by=['month', 'utility', 'state']).reset_index(drop=True) print(full_df)
方法二:基于现有组合的MultiIndex重索引
如果更倾向用MultiIndex思路,可以基于原数据中已有的utility-state组合生成索引,避免产生无效组合:
import pandas as pd # 原数据 df = pd.DataFrame({'year':[23,23,23,23,23,23], 'month':[1,1,1,2,3,3], 'utility':['A','A','B','A','A','B'], 'state':['NY','NJ','CA','NJ','NY','CA']}) # 1. 生成原数据中存在的utility-state多索引 pair_index = pd.MultiIndex.from_frame(df[['utility', 'state']].drop_duplicates()) # 2. 获取所有月份的索引 month_index = pd.Index(df['month'].unique().sort(), name='month') # 3. 生成完整的多索引(year固定为23) full_index = pd.MultiIndex.from_product( [[23], month_index, pair_index], names=['year', 'month', 'utility', 'state'] ) # 4. 重索引原数据并重置索引 full_df = df.set_index(['year', 'month', 'utility', 'state']).reindex(full_index).reset_index() print(full_df)
两种方法都能得到目标结果,不会生成A-CA这类原数据中不存在的组合。
内容的提问来源于stack exchange,提问作者jfang
相关产品推荐
相关产品推荐

