При наличии в источнике данных хотя бы одного отсутствующего значения библиотека pandas преобразует все целочисленные значения в значения с плавающей точкой.
У нас есть Series с числами: [1, 2, 3, np.nan, 4, 5]. Когда мы вызываем numbers.sum(skipna=False), мы явно указываем, что НЕ хотим пропускать значения nan. В этом случае, любая арифметическая операция с nan (включая суммирование) даст результат nan. Любая арифметическая операция с nan всегда возвращает nan
Python интернирует (переиспользует) строковые литералы, особенно короткие. Поэтому a is b возвращает True, так как обе переменные указывают на один и тот же объект в памяти. А вот c создаётся в рантайме с помощью join(), и хоть его значение такое же, объект в памяти другой, поэтому a is c возвращает False.
Метод __bool__ управляет логическим значением объекта. В данном случае он всегда возвращает False, и условие if a: не выполняется, поэтому печатается No.
В коде есть глобальная переменная x = 10. В функции func() есть операция del x. Когда Python видит операцию del x внутри функции, он считает x локальной переменной этой функции. Но при этом, когда выполняется print(x), Python пытается использовать локальную переменную x, которая еще не была инициализирована (так как del x выполняется после).