Использование последовательности or
логических тестов должно помочь вам.
df = df.applymap(lambda x: int(round(float(x))) if not (isinstance(x, str) or math.isnan(x) or x<0) else x)
Сначала этот код проверит, является ли x строкой.Если это не так, он проверит, если nan
.Если это не так, он проверит, является ли значение отрицательным (я считаю, что эту последнюю часть можно удалить).Если какой-либо из этих операторов возвращает True
, программа немедленно не округляет значение.Иначе так и будет.
Вы можете даже добавить больше правил к этому утверждению, но вам придется обратить внимание: порядок их добавления будет определять, будут ли работать правила.Например, если я вставил правила в следующем порядке, система выдаст ошибку при поиске строкового значения:
x<0 or math.isnan(x) or isinstance(x, str)
Это происходит потому, что первая попытка проверить заданное значение будет заключаться в тесте.чтобы проверить, если это отрицательное число.Однако это сравнение не будет работать со строкой.Вот почему мы сначала добавляем правило, чтобы проверить, является ли оно строкой, прежде чем продолжить.
Поэтому при добавлении правил я повторяю: будьте осторожны с порядком их вставки!