Хранить эти положения отдельными переменными (где они будут float), и только потом присваивать их самим rect.x/y
Тут для примера я завел отдельные (rx/ry), но можно использовать и уже заведенные x/y только с учетом, что это предполагалось как центр объекта.
..
    class Bullet(pygame.sprite.Sprite):
        def __init__(self, screen, speed_x):
            pygame.sprite.Sprite.__init__(self)
            self.x, self.y = 550.0, 450.0
            self.screen = screen
            self.image = pygame.image.load("img/bullet.png").convert()
            self.rect = self.image.get_rect(center=(self.x, self.y))
            # для хранения наших координат
            self.rx, self.ry = self.rect.x, self.rect.y
            self.speed_x = speed_x
            self.speed_y = 0.1
        def update(self):
            if self.ry > 0:
                self.ry -= self.speed_y
                self.rx += self.speed_x
                # и вот теперь уже присваиваем значения
                self.rect.x, self.rect.y = self.rx, self.ry
            else:
                self.kill()
Можно и напрямую присваивать x/y (без этих rx/ry) только работать с rect.centerx:
..
        def update(self):
            if self.y > 0:
                self.y -= self.speed_y
                self.x += self.speed_x
                self.rect.centerx, self.rect.centery = self.x, self.y
            else:
                self.kill()