缺失值(NaN 值)与填充值的重叠图

Posted

技术标签:

【中文标题】缺失值(NaN 值)与填充值的重叠图【英文标题】:overlap graph of missing values (NaN values) with filled values 【发布时间】:2020-10-14 11:15:05 【问题描述】:

我有下面的 Panda DataFrame,它包含两列。第一列是包含缺失值(NaN 值)的原始值,第二列是缺失插补的结果,用于填充第一列中的 NaN 值。如何将这两列绘制在同一张图中显示原始值和填充值,如下图所示:

Data=pd.DataFrame([[3.83092724,        np.nan],
   [       np.nan, 3.94103207],
   [       np.nan, 3.86621724],
   [3.48386179,        np.nan],
   [       np.nan, 3.7430167 ],
   [3.2382959 ,        np.nan],
   [3.9143139 ,        np.nan],
   [4.46676265,        np.nan],
   [       np.nan, 3.9340262 ],
   [3.650658  ,        np.nan],
   [       np.nan, 3.10590516],
   [4.19497691,        np.nan],
   [4.11873876,        np.nan],
   [4.15286075,        np.nan],
   [4.67441617,        np.nan],
   [4.50631534,        np.nan],
   [       np.nan, 4.01349688],
   [       np.nan, 3.48459778],
   [       np.nan, 3.83495488],
   [       np.nan, 3.10590516],
   [       np.nan, 4.09355884],
   [4.8433281 ,        np.nan],
   [       np.nan, 3.33450675],
   [4.86672126,        np.nan],
   [       np.nan, 3.2382959 ],
   [       np.nan, 3.48210011],
   [       np.nan, 3.00958811],
   [       np.nan, 3.05774663]], columns=['original', 'filled'])

【问题讨论】:

【参考方案1】:

您需要标记,否则如果您的单个原始值被缺失值包围,则图表将毫无意义。 我们首先绘制原始值。然后,对于填充值,我们使用原始值填充与现有填充值直接相邻的任何缺失值,以获得从该原始值到下一个/前一个填充值的虚线。最后,我们将这些修改后的填充值列绘制为虚线。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df=pd.DataFrame([[3.83092724, np.nan],
   [       np.nan, 3.94103207],
   [       np.nan, 3.86621724],
   [3.48386179,        np.nan],
   [       np.nan, 3.7430167 ],
   [3.2382959 ,        np.nan],
   [3.9143139 ,        np.nan],
   [4.46676265,        np.nan],
   [       np.nan, 3.9340262 ],
   [3.650658  ,        np.nan],
   [       np.nan, 3.10590516],
   [4.19497691,        np.nan],
   [4.11873876,        np.nan],
   [4.15286075,        np.nan],
   [4.67441617,        np.nan],
   [4.50631534,        np.nan],
   [       np.nan, 4.01349688],
   [       np.nan, 3.48459778],
   [       np.nan, 3.83495488],
   [       np.nan, 3.10590516],
   [       np.nan, 4.09355884],
   [4.8433281 ,        np.nan],
   [       np.nan, 3.33450675],
   [4.86672126,        np.nan],
   [       np.nan, 3.2382959 ],
   [       np.nan, 3.48210011],
   [       np.nan, 3.00958811],
   [       np.nan, 3.05774663]], columns=['original', 'filled'])

_,ax = plt.subplots()
df.original.plot(marker='o', ax=ax)

m = (df.filled.isna()&df.filled.shift(1).notna()) | (df.filled.isna()&df.filled.shift(-1).notna())
df.filled.fillna(df.loc[m,'original']).plot(ls='--', ax=ax, color=ax.get_lines()[0].get_color())


以上是针对一般情况的干净解决方案。如果原始值是用一条不透明的实线绘制的,而填充值的线宽不大于原始值的线宽,则可以简单地先绘制完全填充的值,然后在该线的顶部绘制原始值价值观:
df.filled.fillna(df.original).plot(ax=ax, color='blue', ls='--')
df.original.plot(marker='o', ax=ax, color='blue')

【讨论】:

非常感谢 Stef。这是我的问题的一个很好的解决方案。

以上是关于缺失值(NaN 值)与填充值的重叠图的主要内容,如果未能解决你的问题,请参考以下文章

缺失值的常见填充方法

熊猫:使用最后可用的填充缺失值

用之前的非缺失值填充缺失的 pandas 数据,按 key 分组

pandas使用replace函数将所有的无穷大值np.inf替换为缺失值np.nan使用pandas的fillna函数用经验固定值填充缺失值np.nan

带有递增值的 Pandas fillna

python和R对dataframe的缺失值的统计与填充:dplyrtidyrfillnaisnaisnullsum