Удалить список, если nan находится в списках списков

У меня есть список списков из фрейма данных Pandas, который содержит значения nan. Я хотел бы удалить все списки, содержащие какие-либо значения nan. Затем постройте оставшиеся значения.

Пример

test = [[1,2],[1,nan],[3,4]]

Конечные результаты

test = [[1,2],[3,4]]

Если возможно, я также хотел бы сделать график из конечных результатов, используя любой метод построения графика. Мы будем очень признательны за любую помощь, которую вы можете оказать на этом пути.

Я прошу прощения за путаницу, которую вызвал этот вопрос, список списков был взят из фрейма данных pandas, поэтому в примере присутствует nan. Я хотел бы сохранить фрейм данных как есть и хотел бы работать со списком списков


person Panic_Picnic    schedule 06.11.2020    source источник
comment
Это недопустимый синтаксис Python.   -  person baduker    schedule 06.11.2020
comment
Вы используете панды?   -  person Anthony Inthavong    schedule 06.11.2020
comment
Предоставьте минимальный воспроизводимый пример, включая воспроизводимые образцы ваших входных и выходных данных и код за то, что вы уже пробовали на основе ваших собственных исследований   -  person G. Anderson    schedule 06.11.2020
comment
Я прошу прощения за путаницу, которую вызвал этот вопрос, список списков был взят из фрейма данных pandas, поэтому в примере присутствует nan. Я хотел бы сохранить фрейм данных как есть и хотел бы работать со списком списков.   -  person Panic_Picnic    schedule 06.11.2020


Ответы (2)


Удаление значений из списка

Использование filter

nan не является правильным синтаксисом Python и используется только в библиотеке Pandas. Поэтому я собираюсь заменить это значение на None.

мы можем использовать функцию filter для удаления любых значений в списке, который содержит значение nan.

test = list(filter(lambda x: None not in x, test))

Использование понимания списка

Изменить: должно быть x вместо test. Спасибо @fountainhead

test = [x вместо x в тесте, если None не в тесте]

test = [x for x in test if None not in x]

Оба вернут список со значениями, не содержащими None в них.

Заговор

Мы можем использовать библиотеку под названием matplotlib для построения графика. Например, чтобы создать точечную диаграмму:

import matplotlib.pyplot as plt
plt.scatter(x, y)

где plt.scatter принимает значения x и значения y для строки и столбца соответственно. Полный код выглядит следующим образом:

import matplotlib.pyplot as plt

test = [[1,2],[1,None],[3,4]]
test = list(filter(lambda x: None not in x, test))

x = [x for x,y in test]
y = [y for x,y in test]

# Assume all first elements are x values second elements are y values
plt.scatter(x, y)
plt.show()

Примеры изображений следующие

введите здесь описание изображения

person Anthony Inthavong    schedule 06.11.2020
comment
Я не думаю, что test = [x for x in test if None not in test] будет работать, так как nan отличается от None. - person fountainhead; 06.11.2020
comment
Если значение равно nan, то мы можем проверить, есть ли в списке np.nan из numpy. - person Anthony Inthavong; 06.11.2020
comment
-- Все равно не получится. Кажется, в вашем понимании списка есть опечатка. Выражение [x for x in test if None not in test] следует исправить на [x for x in test if None not in x] - person fountainhead; 07.11.2020
comment
@источник да! Спасибо, что заметили, исправлю - person Anthony Inthavong; 07.11.2020
comment
Если присутствует np.nan, ваше решение filter() и решения для понимания списка будут работать. Однако, если присутствует np.float64("NaN") или np.float32("NaN") или np.float("NaN"), оба ваших решения потерпят неудачу. Подробные причины см. здесь. Чтобы ваше решение filter() работало в этих случаях, правильная лямбда должна быть lambda x: not any(math.isnan(y) for y in x). Чтобы ваше понимание списка работало в этих случаях, отправьте мой ответ на OP. - person fountainhead; 07.11.2020
comment
В лямбде, которую я предложил выше, вы также можете использовать np.isnan() вместо math.isnan() - person fountainhead; 07.11.2020

Вы можете перестроить свой список, используя понимание списка, без подсписков, имеющих nans:

import math

test = [sub_list for sub_list in test if not any(math.isnan(x) for x in sub_list)]

Если вы хотите удалить из списка test «на месте», вы можете сделать это:

import math

for (which, sub_list) in enumerate(test[::-1]):
    if any(math.isnan(x) for x in sub_list):
        del test[len(test)-1-which]
person fountainhead    schedule 06.11.2020