pandas 跳过在python中绘制NaN和inf值

0wi1tuuw  于 2023-03-06  发布在  Python
关注(0)|答案(2)|浏览(241)

有没有办法跳过在python中绘制NaN和Inf值?
假设我有这样的东西:

m1  m2  m3
4   5   2
3   2   3
4   3   4
2   5   0
4   3   8
3   4   0
2   3   4

我想画出m1m2/m3的关系,所以有些情况下我会除以0,所以当我画出时,它会抛出ValueError: Axis limits cannot be NaN or Inf
有什么办法?谢谢
(我在panda中使用 Dataframe ,我转到m4 = df['m2'] / df['m3'],然后转到m1m4的绘图)
请注意, Dataframe 本身中没有inf或Nan值,但它们在操作后出现。

snz8szmq

snz8szmq1#

你能做的就是生成所有元素都是有限的行。

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
...并且可能包含无限元素。要解决此问题,请在数据框df上使用NumPyisfinite,然后使用.all(1),如果行中的所有单元格都是有限的,则返回TRUE:
df[np.isfinite(df).all(1)]
为便于查看,请参见随附的屏幕截图。
第一节第一节第一节第一节第一次
在此之后,您现在可以绘制m1m4的关系图,而无需担心无穷大值:

希望这有帮助!

2g32fytz

2g32fytz2#

根据我们提供的工具 * 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

(no键 * 3 * 和 * 5 * 的值),可根据需要绘制。

编辑

我注意到(至少在 * Pandas * v. * 0.25 * 中)即使在 * y * 列中有 * Inf * 或 * NaN * 值,也可以生成DataFrame散点图。
我做了以下实验:
1.创建了 * m4***,没有**删除 * Inf / Nan * 值,但设置了其名称(稍后在 * join * 中需要):

m4 = df.m2.divide(df.m3).rename('m4')

1.将第二次出现的 * Inf * 替换为 * NaN *:

m4.iat[5] = np.nan

所以现在它同时包含 * Inf * 和 * NaN *。
1.生成绘图:

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

实际上,我得到了图片,没有任何错误。
显然,在这种情况下,任何 * Inf / NaN * 值都被悄悄地丢弃,并且只有在此之后才生成图片。

相关问题