Matplotlib отображает значения nan

Я пытаюсь построить гистограмму в matplotlib, но каким-то образом она отображает значения nan.

import pandas as pd
import matplotlib.pyplot as plt
import math 


engine_data= pd.read_excel('edb-emissions-databank_v28c_web.xlsx',
                    sheet_name = 'nvPM Emissions')

manufacturers = engine_data.value_counts('Manufacturer').index.values


def Average(engine_type, column, manufacturer):
   
    averages = []
    for manufacturer in manufacturers:  
        average = engine_data[(engine_data.iloc[:,2]== manufacturer) & (engine_data.iloc[:,5] == engine_type)][column].mean()
        averages.append(average)
    
    return averages


TF_particles = Average('TF','nvPM LTO Total Mass (mg)', manufacturers)
MTF_particles = Average('MTF','nvPM LTO Total Mass (mg)', manufacturers) 


results_TF = list(zip(manufacturers, TF_particles))
results_MTF = list(zip(manufacturers, MTF_particles))


for result in results_TF:
    if math.isnan(result[1]) == True:
        results_TF.remove(result)


for result in results_MTF:
    if math.isnan(result[1]) == True:
        results_MTF.remove(result)
        
fig ,ax = plt.subplots(1,2,figsize = (150,50))

for result in results_TF:
    ax[0].bar(result[0], result[1], color = 'red')

for result in results_MTF:
    ax[1].bar(result[0], result[1], color = 'blue')

ax[0].tick_params(axis='x', labelsize=70)
ax[0].tick_params(axis='y', labelsize=70)

ax[1].tick_params(axis='x', labelsize=30)
ax[1].tick_params(axis='y', labelsize=30)

plt.show()

Я попытался удалить значения nan, но хотя мне удалось удалить некоторые из них, некоторые из них все еще остались. Я рисую зависимость между производителями двигателей и их средними выбросами в цикле LTO. У меня есть два графика, потому что я разделяю два типа двигателей, которые у меня есть: TF = турбовентиляторный и MTF = смешанный турбовентиляторный. NaN вызваны тем фактом, что у некоторых производителей нет движков TF или наоборот, поэтому, когда я выполняю zip, я получаю некоторые значения nan.

Вот что я получаю

Пожалуйста, предоставьте упрощенный пример, демонстрирующий проблему (он же минимально воспроизводимый пример). Кроме того, текст на вашем рисунке нечитаем, поэтому неясно, что происходит (но если бы у нас был MRE, мы могли бы запустить код напрямую и убедиться в этом сами).

tdy 04.04.2023 20:17

При печати результатов_TF или результатов_MTF он отображается как nan

Dan 04.04.2023 21:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы перебираете results_TF и results_MTF, пытаясь удалить элементы из обоих списков, поэтому он пропускает и не улавливает все значения nan. Возможно, было бы проще просто создавать новые списки, а не изменять их, а затем добавлять их в свой гистограмму.

# new lists
results_TF_filtered = [(m, p) for (m, p) in results_TF if pd.notnull(p)]
results_MTF_filtered = [(m, p) for (m, p) in results_MTF if pd.notnull(p)]

fig ,ax = plt.subplots(1,2,figsize = (150,50))

# plotting bar chart
ax[0].bar([m for (m, _) in results_TF_filtered], [p for (_, p) in results_TF_filtered], color = 'red')
ax[1].bar([m for (m, _) in results_MTF_filtered], [p for (_, p) in results_MTF_filtered], color = 'blue')

Обновленный код:

import pandas as pd
import matplotlib.pyplot as plt


engine_data= pd.read_excel('edb-emissions-databank_v28c_web.xlsx',
                    sheet_name = 'nvPM Emissions')

manufacturers = engine_data.value_counts('Manufacturer').index.values


def Average(engine_type, column, manufacturer):
   
    averages = []
    for manufacturer in manufacturers:  
        average = engine_data[(engine_data.iloc[:,2]== manufacturer) & (engine_data.iloc[:,5] == engine_type)][column].mean()
        averages.append(average)
    
    return averages


TF_particles = Average('TF','nvPM LTO Total Mass (mg)', manufacturers)
MTF_particles = Average('MTF','nvPM LTO Total Mass (mg)', manufacturers) 


results_TF = list(zip(manufacturers, TF_particles))
results_MTF = list(zip(manufacturers, MTF_particles))

# new lists
results_TF_filtered = [(m, p) for (m, p) in results_TF if pd.notnull(p)]
results_MTF_filtered = [(m, p) for (m, p) in results_MTF if pd.notnull(p)]

fig ,ax = plt.subplots(1,2,figsize = (150,50))

# plotting bar chart
ax[0].bar([m for (m, _) in results_TF_filtered], [p for (_, p) in results_TF_filtered], color = 'red')
ax[1].bar([m for (m, _) in results_MTF_filtered], [p for (_, p) in results_MTF_filtered], color = 'blue')

ax[0].tick_params(axis='x', labelsize=70)
ax[0].tick_params(axis='y', labelsize=70)

ax[1].tick_params(axis='x', labelsize=30)
ax[1].tick_params(axis='y', labelsize=30)

plt.show()

Другие вопросы по теме