有没有一种方法可以在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值,但它们是在操纵后发生的。
答案 0 :(得分:0)
根据提供给我们 Pandas 的工具,最简单的解决方案是:
您的系列中将不包含 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 值也可以生成。
我做了以下实验:
创建了 m4 而没有,删除了 Inf / Nan 值,但对其进行了设置 名称(稍后需要在 join 中使用):
m4 = df.m2.divide(df.m3).rename('m4')
用 NaN 代替了第二次出现的 Inf :
m4.iat[5] = np.nan
所以现在它同时包含 Inf 和 NaN 。
生成图:
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
出于可视化目的,请参阅所附的屏幕截图。
此后,您现在可以绘制df[np.isfinite(df).all(1)]
与m1
的关系,而不必担心无穷大的值:
希望这会有所帮助!