跳过在python中绘制NaN和inf值的绘图

时间:2019-09-29 03:51:24

标签: python pandas

有没有一种方法可以在Python中跳过绘制NaN和Inf值?

说我有类似的东西:

invalid_grant

并且我想绘制m1 m2 m3 4 5 2 3 2 3 4 3 4 2 5 0 4 3 8 3 4 0 2 3 4 m1,所以在某些情况下我被零除,所以当我绘制时,它会抛出m2/m3

有什么解决方案?谢谢

(我正在ValueError: Axis limits cannot be NaN or Inf用熊猫去绘制m4 = df['m2'] / df['m3']m1的情节中使用数据框)

请不要在数据帧本身中没有inf或Nan值,但它们是在操纵后发生的。

2 个答案:

答案 0 :(得分:0)

根据提供给我们 Pandas 的工具,最简单的解决方案是:

  • NaN 替换 Inf 值(正负),
  • 删除 NaN 值。

您的系列中将不包含 Inf NaN

因此,生成m4,将指令扩展为:

m4 = (df['m2'] / df['m3']).replace([np.inf, -np.inf], np.nan).dropna()

获取(针对您的情况)

0    2.500000
1    0.666667
2    0.750000
4    0.375000
6    0.750000
dtype: float64

(键 3 5 没有值),可以根据需要进行绘制。

编辑

我注意到(至少在 Pandas v。 0.25 中)一个DataFrame散点图 即使使用 y 列中的 Inf NaN 值也可以生成。

我做了以下实验:

  1. 创建了 m4 而没有,删除了 Inf / Nan 值,但对其进行了设置 名称(稍后需要在 join 中使用):

    m4 = df.m2.divide(df.m3).rename('m4')
    
  2. NaN 代替了第二次出现的 Inf

    m4.iat[5] = np.nan
    

    所以现在它同时包含 Inf NaN

  3. 生成图:

    df.join(m4).plot.scatter(x='m1', y='m4');
    

实际上,我得到了照片,没有任何错误。

显然,在这种情况下,所有 Inf / NaN 值都被静默删除 并且仅之后生成图片。

答案 1 :(得分:0)

您可以做的是产生所有元素都是有限的行。

import pandas as pd, numpy as np 
m1 = [4 ,3 ,4 ,2 ,4 ,3 ,2]
m2 = [5 ,2 ,3 ,5 ,3 ,4 ,3]
m3 = [2, 3, 4, 0, 8, 0, 4]
df = pd.DataFrame({'m1':m1,'m2':m2,'m3':m3})

m4 = m2/m3

df['m4']= df.m2/df.m3

...并且可能包含无限元素。要解决此问题,请在数据帧NumPy上使用isfinite的{​​{1}},然后使用.all(1),如果一行中的所有单元格都是有限的,则返回TRUE:

df

出于可视化目的,请参阅所附的屏幕截图。

enter image description here enter image description here

此后,您现在可以绘制df[np.isfinite(df).all(1)]m1的关系,而不必担心无穷大的值: enter image description here

希望这会有所帮助!