Pandas vs PySpark na Prática

Por Réulison Silva
Réulison Silva
Published on
Pandas vs PySpark

Quando trabalhamos com dados, duas ferramentas se destacam: Pandas, ideal para conjuntos de dados que cabem na memória de uma única máquina, e PySpark, projetado para processamento distribuído em grandes volumes de dados. Embora os conceitos sejam semelhantes, a sintaxe e a abordagem mudam significativamente.

Neste artigo, vamos explorar as operações mais frequentes no dia a dia de um analista ou engenheiro de dados, comparando lado a lado o código em Pandas e PySpark. Prepare-se para exemplos práticos e explicações detalhadas!

1. Pivot: Transformando Linhas em Colunas

Pandas

Use pivot_table para criar uma tabela dinâmica.

df.pivot_table(index='A', columns='B', values='C')

Exemplo: Suponha vendas por produto (linhas) e mês (colunas). Queremos os valores como colunas separadas.

PySpark

O método pivot é aplicado após um groupBy.

df.groupBy('A').pivot('B').agg(sum('C'))

Explicação: Em PySpark, você sempre precisa especificar a função de agregação (sum, avg, etc.) dentro do pivot.

2. Unpivot / Melt: Transformando Colunas em Linhas

Pandas

Use melt para "derreter" colunas em linhas.

pd.melt(df, id_vars=['A'], value_vars=['B', 'C'])

Isso mantém a coluna A como identificador e empilha os valores de B e C em uma nova coluna.

PySpark

Não há uma função melt nativa, mas podemos usar stack dentro de select.

df.select('A', expr("stack(2, 'B', B, 'C', C) as (key, value)"))

O número 2 indica quantas colunas estão sendo empilhadas. Cuidado: essa abordagem exige conhecer a estrutura de antemão.

3. Coluna Agregada (Operações Aritméticas Simples)

Pandas

Crie uma nova coluna diretamente com operadores.

df['total'] = df['X'] + df['Y']

PySpark

Use withColumn e funções como col.

from pyspark.sql.functions import col
df = df.withColumn('total', col('X') + col('Y'))

4. Remover Duplicatas

Pandas

drop_duplicates permite especificar subconjunto de colunas.

df.drop_duplicates(subset=['A', 'B'])

PySpark

O método equivalente é dropDuplicates.

df.dropDuplicates(['A', 'B'])

Ambas mantêm a primeira ocorrência por padrão.

5. Coluna Condicional (If-Else)

Pandas

Use apply com uma função lambda.

df['status'] = df['score'].apply(lambda x: 'Aprovado' if x >= 70 else 'Reprovado')

PySpark

A abordagem distribuída usa when e otherwise.

from pyspark.sql.functions import when, col
df = df.withColumn('status', when(col('score') >= 70, 'Aprovado').otherwise('Reprovado'))

Isso é mais eficiente que apply em grandes volumes.

PySpark

df.groupBy('category').agg(sum('sales'))

ou

df.groupBy('category').sum('sales')

Diferença: PySpark exige importar funções de agregação ou usar métodos específicos como sum(), avg(), etc.

7. Ordenar Dados

Pandas

df.sort_values(by='date', ascending=False)

PySpark

df.orderBy(col('date').desc())

Também é possível usar sort como alias.

8. Filtrar Dados

Pandas

Indexação booleana direta.

df[df['age'] > 30]

PySpark

Use filter ou where.

df.filter(col('age') > 30)

9. Renomear Colunas

Pandas

df.rename(columns={'old_name': 'new_name'})

PySpark

df.withColumnRenamed('old_name', 'new_name')

Para múltiplas colunas, encadeie withColumnRenamed ou use select com alias.

10. Preencher Valores Nulos

Pandas

df.fillna({'col1': 0, 'col2': 'N/A'})

PySpark

A sintaxe é idêntica!

df.fillna({'col1': 0, 'col2': 'N/A'})

Mas atenção: no PySpark, fillna também aceita um valor único para todas as colunas.

11. Converter Tipo de Dados

Pandas

df['id'] = df['id'].astype(str)

PySpark

Use cast.

from pyspark.sql.functions import col
df = df.withColumn('id', col('id').cast('string'))

12. Join (Mesclar DataFrames)

Pandas

pd.merge(df1, df2, on='key', how='inner')

PySpark

df1.join(df2, df1.key == df2.key, 'inner')

No PySpark, a condição de join é explícita (colunas iguais). Para joins em múltiplas colunas, use &.

13. Coluna Derivada (Exemplo: Extrair Ano de uma Data)

Pandas

Assumindo que date é do tipo datetime.

df['ano'] = df['date'].dt.year

PySpark

Use a função year.

from pyspark.sql.functions import year
df = df.withColumn('ano', year(col('date')))

Existem várias funções de data: month, dayofmonth, date_format, etc.

14. Selecionar Colunas

Pandas

df[['col1', 'col2']]

PySpark

df.select('col1', 'col2')

15. Contagem de Valores Distintos

Pandas

df['category'].unique()

Retorna um array com os valores únicos.

PySpark

Para apenas a contagem:

from pyspark.sql.functions import countDistinct
df.select(countDistinct('category')).collect()

Para obter os valores distintos em si, use df.select('category').distinct().collect().

Considerações Finais

  • Pandas é mais expressivo e direto para dados pequenos/médios (até alguns GBs). A curva de aprendizado é suave.

  • PySpark exige pensar em paralelismo e usar funções que evitam coletar dados para o driver desnecessariamente. Sempre que possível, prefira withColumn, agg, join em vez de collect() ou toPandas() em grandes volumes.

A boa notícia: muitos conceitos são transferíveis. Se você domina o Pandas, a migração para PySpark será natural depois de entender as pequenas diferenças de sintaxe e o paradigma lazy evaluation (as transformações só são executadas quando uma ação como show() ou collect() é chamada).

Agora é praticar! Experimente refatorar um script Pandas para PySpark e veja a escalabilidade acontecer.

Fique ligado

Seja um Expert em Growth

Receba insights práticos sobre marketing, dados, performance e tecnologia direto no seu email.