如何在Pandas中追加不在指定列表中的季度行并设价格为0
补全DataFrame缺失季度行的实现方案
需求说明
现有包含设施季度价格数据的DataFrame,仅存在Q1、Q2的记录;需要根据给定的季度列表['Q1','Q2','Q3','Q4'],为缺失的季度追加对应行,且缺失行的Price设为0。
准备代码
先生成原始DataFrame和季度列表:
import pandas as pd from io import StringIO # 生成原始数据 df = """ Facility Quarter Price F1 Q1 2.1 F1 Q2 1.2 """ df = pd.read_csv(StringIO(df.strip()), sep='\s\s+', engine='python') quarters = ['Q1','Q2','Q3','Q4']
方法一:全量组合+左连接填充
先构造包含所有设施与季度的完整行集合,再与原始数据合并补全缺失值:
# 获取所有唯一设施 facilities = df['Facility'].unique() # 生成设施-季度的全量笛卡尔积 full_comb = pd.MultiIndex.from_product([facilities, quarters], names=['Facility', 'Quarter']).to_frame(index=False) # 左连接原始数据,缺失Price填充0 result = pd.merge(full_comb, df, on=['Facility', 'Quarter'], how='left').fillna({'Price': 0}) print(result)
方法二:多级索引重排
通过设置多级索引,重索引补全缺失项后填充0:
# 设置Facility和Quarter为多级索引 df.set_index(['Facility', 'Quarter'], inplace=True) # 生成包含所有设施与季度的全量索引 full_index = pd.MultiIndex.from_product([df.index.get_level_values(0).unique(), quarters], names=['Facility', 'Quarter']) # 重索引并填充0,最后重置索引为列 result = df.reindex(full_index, fill_value=0).reset_index() print(result)
输出结果
两种方法最终都会得到目标DataFrame:
Facility Quarter Price 0 F1 Q1 2.1 1 F1 Q2 1.2 2 F1 Q3 0.0 3 F1 Q4 0.0
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

