SQL vs Pandas - Manipulando strings
Neste artigo vamos ver como podemos manipular strings utilizando o Pandas. Vamos comparar como isto é feito no SQL antes de ver a forma como o Pandas obtem o mesmo resultado.
O que você vai aprender neste artigo?
* Retornando parte de uma string a partir da esquerda
* Retornando parte de uma string a partir da direita
* Extraindo parte de uma string a partir de qualquer posição
* Retornar parte de uma string antes de um determinado caractere.
* Retornar parte de uma string depois de um determinado caractere.
Os dados de testes que serão utilizados no SQL serão os seguintes
CREATE TABLE minha_tabela (
campo varchar(255),
);
INSERT INTO minha_tabela (campo) VALUES ("KGW-7688");
INSERT INTO minha_tabela (campo) VALUES ("NEZ-0398");
INSERT INTO minha_tabela (campo) VALUES ("MZN-7217");
No Pandas a cada exemplo será mostrado como criar o dataset de testes
Retornando parte de uma string a partir da esquerda
No SQL utilizamos a função LEFT para retornar parte de um campo a partir de uma esquerda. Esta função recebe dois parâmetros, o primeiro é o campo que vamos utilizar e o segundo é a quantidade de caracteres a ser retornado
SELECT LEFT(campo, 3) FROM minha_tabela
Neste exemplo, retornamos os 3 primeiros caracteres do campo.
No Pandas utilizamos o método str no campo desejado.
import pandas as pd
data = {"campo": ["KGW-7688","NEZ-0398","MZN-7217"]}
df = pd.DataFrame(data, columns= ["campo"])
esquerda = df["campo"].str[:3]
print (esquerda)
Retornando parte de uma string a partir da direita
Da mesma forma que temos uma função LEFT, no SQL temos uma função chamada RIGHT, que também recebe dois parâmetros
SELECT RIGHT(campo, 4) FROM minha_tabela
Neste exemplo, retornamos os 4 últimos caracteres do campo.
No Pandas resolvemos isso utilizamos o método str no campo desejado com um valor negativo.
import pandas as pd
data = {"campo": ["KGW-7688","NEZ-0398","MZN-7217"]}
df = pd.DataFrame(data, columns= ["campo"])
direita = df["campo"].str[-4:]
print (direita)
Extraindo parte de uma string
Sabemos que nem sempre o que precisamos está no começo ou no fim do banco, mas a partir de uma posição específica. No SQL temos o SUBSTRING
SELECT SUBSTRING(campo1, 2, 5) from minha_tabela
Seus três parâmetros são o campo, a posição inicial e a posição final.
No Pandas continuamos utilizado o str
import pandas as pd
data = {"campo": ["KGW-7688","NEZ-0398","MZN-7217"]}
df = pd.DataFrame(data, columns= ["campo"])
resultado = df["campo"].str[2:5]
print (resultado)
Retornar parte de uma string antes de um determinado caractere
É comum que seja necessário retornar parte do campo a partir de uma certa posição. Em nosso exemplo, os dados tem o mesmo tamanho, então se eu quiser retornar os dados a partir do traço seria muito mais fácil usar o metodo LEFT e pegar os três primeiros caracteres. Mas em exemplos reais pode não ser tão simples. No exemplo a seguir vamos ver como retornar dados antes do traço
SQL SERVER
SELECT SUBSTRING(campo, 0, charindex("-", campo, 0)) FROM minha_tabela
MYSQL
SELECT SUBSTRING_INDEX(campo,"-",1) FROM minha_tabela
Neste exemplo quando trabalhamos com o SQL SERVER utilizamos a função SUBSTRING junto com a função CHARINDEX. A função CHARINDEX retorna a posição da primeira ocorrência do caractere desejado. No MySQL podemos usar a função SUBSTRING_INDEX.
No Pandas vamos precisar usar algo junto com o str, que é o split. O split vai servir para quebrar o conteúdo do campo num array, com base no caractere informado. Transformado num array, bastará pegar a primeira posição.
import pandas as pd
data = {"campo": ["KGW-7688","NEZ-0398","MZN-7217"]}
df = pd.DataFrame(data, columns= ["campo"])
resultado = df["campo"].str.split("-").str[0]
print (resultado)
Retornar parte de uma string depois de um determinado caractere
Faremos agora o exemplo contrário. Desejamos retornar todo o campo após o traço.
SQL SERVER
SELECT SUBSTRING(campo, CHARINDEX("-", campo) + 1, LEN(campo)) FROM minha_tabela
MYSQL
SELECT SUBSTRING_INDEX(campo,"-",-1) FROM minha_tabela
No Pandas é o mesmo processo anterior, a diferença é que vamos retornar a segunda posição do array
import pandas as pd
data = {"campo": ["KGW-7688","NEZ-0398","MZN-7217"]}
df = pd.DataFrame(data, columns= ["campo"])
resultado = df["campo"].str.split("-").str[1]
print (resultado)