Existem algumas alternativas para otimizar a quantidade de espaço utilizado para o armazenamento de dados (sem perder a estrutura original). Uma delas é trabalhar com outros formatos de arquivo. O formato CSV que você usa nesse post é popular por ser simples de entender e fácil de um humano visualizar usando um bloco de notas, por exemplo, então é muito utilizado em tutoriais e aulas introdutórias. Porém, para quantidades maiores de dados, e em ambientes profissionais - onde os dados serão armazenados para serem lidos com frequência depois - é mais comum utilizarmos arquivos que utilizam armazenamento do tipo column-wise ao invés de row-wise.
Por exemplo, o formato .parquet è um formato moderno muito otimizado, column-wise, e utilizado com frequência em ambientes de big data (mas pode ser utilizado em ambientes com bases pequenas ou médias também). Ao salvar um arquivo desse tipo, é aplicado um algoritmo de compressão sem perdas nos dados, muito eficiente (é muito maneiro, sugiro procurar depois como funciona).
Sugiro testar fazer um benchmark da quantidade de memória utilizada com os dados originais (sem o agrupamento).
No pandas, pra trabalhar com parquets ao invés de csv, é só mudar a chamada da função to_csv() para to_parquet(), então é tão fácil quanto.
Compare a velocidade de leitura deles também! Usando read_parquet() ao invés de read_csv(). como é column-wise, a leitura do arquivo via código é impressionantemente rápida.
A única desvantagem desse tipo de arquivo para casos de análise/ciência de dados é que, como ele é um binário, você não consegue abri-lo com o Bloco de Notas para dar uma olhada em seu conteúdo. Mas como você já está usando o Pandas, é só dar um .head() que essa desvantagem é completamente mitigada. Além disso, abrir um arquivo de 1.6GB no bloco de notas demora anos, né. Melhor usar o head() mesmo.