Пропустить построение значений NaN и inf в python - PullRequest
1 голос
/ 29 сентября 2019

Есть ли способ пропустить построение значений NaN и Inf в python?

Скажем, у меня есть что-то вроде:

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 против m4)

Пожалуйста, не указывайте значения inf или Nan всама датафрейм, но они возникают после манипуляций.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

То, что вы можете сделать, это получить строки, где все его элементы конечны.

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 в вашем фрейме данных df, а затем используйте .all (1), который возвращает TRUE, если все ячейки в строке конечны:

df[np.isfinite(df).all(1)]

Для наглядности см. Прилагаемые снимки экрана.

enter image description here enter image description here

После этоготеперь вы можете строить m1 против m4, не беспокоясь о бесконечных значениях: enter image description here

Надеюсь, это поможет!

0 голосов
/ 29 сентября 2019

В зависимости от того, какие инструменты предоставляют нам Панды , самое простое решение:

  • заменить Inf значения (как положительные, так и отрицательные) на NaN ,
  • drop NaN значения.

Они в вашей серии не будут содержать ни Inf s nor NaN s.

Итак, генерируя 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 может быть создан даже со значениями Inf или NaN в y столбец.

Я провел следующий эксперимент:

  1. Создано m4 без удаление Inf / Nan значений, но с указанием его имени (понадобится через мгновение в join ):

    m4 = df.m2.divide(df.m3).rename('m4')
    
  2. Заменено второе вхождение Inf на NaN :

    m4.iat[5] = np.nan
    

    , поэтому теперь оно содержит Inf и NaN .

  3. Создан сюжет:

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

ДействуетЯ получил изображение без ошибок.

По-видимому, любые значения Inf / NaN в этом случае тихо сбрасываются и только после этого изображение генерируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...