Pandas dataframe.plot折线图首两个索引数据未绘制问题排查
排查DataFrame索引242.0与243.0未在折线图显示的问题
从你的描述和代码来看,最可能的原因是这两个索引对应的行数据全为NaN,matplotlib绘制折线图时会默认跳过包含NaN的点,导致它们不显示。下面是具体的排查步骤和修复方案:
第一步:确认问题根源
先在代码里添加调试输出,明确这两个索引的状态和对应数据:
修改你的plot函数,在pd.concat之后添加以下代码:
# 保存合并后的DataFrame以便检查 combined_df = pd.concat(dfs, axis=1, sort=False).sort_index() # 打印DataFrame基本信息,确认索引范围和列数据情况 print("合并后DataFrame的基本信息:") print(combined_df.info()) # 专门查看索引242.0和243.0的具体数据 print("\n索引242.0与243.0的对应数据:") print(combined_df.loc[[242.0, 243.0]])
运行后重点关注两个点:
- 这两个索引是否确实存在于
combined_df中 - 对应行的所有列值是否全为
NaN
常见原因与修复方案
原因1:数据全为NaN
如果输出显示这两行全是NaN,说明在合并子DataFrame时,没有任何一个子DataFrame在这两个索引位置有有效数据。你可以根据业务需求选择填充方式:
- 前向填充(用上一个有效值填充):
combined_df = combined_df.fillna(method='ffill') - 后向填充(用下一个有效值填充):
combined_df = combined_df.fillna(method='bfill') - 填充为0或其他默认值:
combined_df = combined_df.fillna(0)
填充完成后再调用plot方法,这两个索引的点就会显示出来。
原因2:子DataFrame索引不匹配
如果发现某个子DataFrame的索引里没有242.0和243.0,那需要检查var_info['runs']的生成逻辑,确认这些索引是否应该被包含进来。你可以在循环遍历run_info时添加打印,查看每个变量的索引范围:
for var in run_info: ctr += 1 if not re.search(stat_type, var): continue var_info = run_info[var] print(f"变量{var}的索引范围:{min(var_info['runs'])} 到 {max(var_info['runs'])}") # 添加这行 try: dfs.append(pd.DataFrame({var: var_info['data']}, index=var_info['runs'])) except: print(var_info['data']) print(var_info['runs']) x=1
如果某个变量本该包含这两个索引却没有,就需要追溯数据收集的逻辑,修复var_info['runs']的生成问题。
原因3:matplotlib跳过不连续点
如果数据不全是NaN但依然不显示,可以尝试在绘图时添加标记点,强制显示所有存在数据的点:
combined_df.plot(kind='line', ax=ax, marker='o') # 添加marker参数
这样即使折线断开,每个有效数据点都会显示为圆点,方便你确认哪些索引有数据。
内容的提问来源于stack exchange,提问作者Ulysses
相关产品推荐
相关产品推荐

