Pandas vs PySpark na Prática

- Published on

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,joinem vez decollect()outoPandas()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.