为多层索引DataFrame补全C索引层级缺失值以实现连续折线图
补全MultiIndex并绘制连续折线图
步骤1:补全C索引的所有取值
首先生成包含所有C取值的完整MultiIndex,再用它重新对齐分组后的数据,自动填充缺失值为NaN:
import pandas as pd # 原始数据 df = pd.DataFrame({'A': [1, 2], 'B':['x', 'y'], 'C':[1, 2], 'D':[0, 0]}) # 分组聚合 grouped = df.groupby(['A', 'B', 'C']).mean() # 获取C的所有唯一取值 all_c_values = df['C'].unique() # 获取A和B的所有组合 ab_combinations = grouped.index.droplevel('C').unique() # 生成完整的MultiIndex:所有A-B组合 × 所有C取值 full_multi_index = pd.MultiIndex.from_product( [ab_combinations.get_level_values('A'), ab_combinations.get_level_values('B'), all_c_values], names=['A', 'B', 'C'] ) # 重新索引,补全缺失的C取值 filled_df = grouped.reindex(full_multi_index)
执行后得到的filled_df即为目标结果:
D A B C 1 x 1 0.0 2 NaN 2 y 1 NaN 2 0.0
步骤2:绘制连续折线图
默认包含NaN的折线会断开,通过插值填充缺失值可让折线保持连续:
import matplotlib.pyplot as plt # 转换为宽格式,方便按A-B组合绘制折线图 wide_df = filled_df['D'].unstack(['A', 'B']) # 线性插值填充缺失值,保证折线连续 interpolated_df = wide_df.interpolate(method='linear') # 绘制折线图 interpolated_df.plot(kind='line', xlabel='C', ylabel='D', marker='o') plt.title('连续折线图:D vs C') plt.show()
若仅需直接连接前后有效数据、无需填充值,也可直接使用wide_df绘图,部分版本的pandas plot会自动跳过NaN点完成连线。
内容的提问来源于stack exchange,提问作者nuemlouno
相关产品推荐
相关产品推荐

