How do I delete a line that contains letters in a dataframe?

Asked

Viewed 48 times

0

I want to exclude lines containing letters in that dataframe

dic = {'Código':dataframe['Cod'], 'Dimensões': list_no_x}

new_dataframe = pd.DataFrame(dic)

print(new_dataframe)

The way out is like this:

   Código  Dimensões
0    1623   10 15 7 
1    5124   15 7 8 
2    4785   20 15 8
3    5251   50 70 22 
4    1578   c10 l20
5    9684   50 10 2 
6    5187   75 20 10 

I want to remove all lines that contain letters or are less than 3 dimensions in the dimension column.

  • What you tried to do to solve and was the problem found?

2 answers

0

To check for letters you can use the pandas.Series.str.contains passing as parameter to search a Regexp like r'[a-zA-Z]' to create a truth table where letters are found.

And to check the quantity of dimensions you can count the occurrence of spaces pandas.Series.str.count

Ex.:

import pandas as pd

dados = { 
    "Código": [1623,5124,4785,5251,1578,9684,5187, 111, 222, 333, 444, 555 ],
    "Dimensões":["10 15 7", "15 7 8", "20 15 8", 
                "50 70 22", "c10 l20", "50 10 2",
                "75 20 10", "10 cl20", "1c0 l20", "111 212", "111 22 33", "11 22 33 44"],
}

# Criar o DataFrame
df = pd.DataFrame( dados )

# Criar uma TABELA VERDADE para selecionar 
# as linhas que contem letras na coluna 'Dimensões'
com_letras = df['Dimensões'].str.contains(r'[A-Za-z]')

print( "# tabela verdade de linhas que contem letras na coluna 'Dimensões':" )
print( com_letras )
print( "\n")


print( "# df de linhas COM letras na coluna 'Dimensões':")
print( df[ com_letras ] )
print( "\n")


# Criar uma TABELA VERDADE para selecionar
# as linhas não tem 2 espaços na coluna 'Dimensões':
dif_2espacos = df['Dimensões'].str.count(' ') != 2

print( "# tabela verdade de linhas não tem 2 espaços na coluna 'Dimensões':")
print(dif_2espacos)
print( "\n")


print( "# df de linhas não tem 2 espaços na coluna 'Dimensões':")
print(df[ dif_2espacos ])
print( "\n")


# Agora você pode utilizar bitwise `~` (NOT)
# para negar uma TABELA VERDADE e dessa forma
# transformar quem é TRUE em FALSE e vice-versa
# e depois bitwise `&` (AND) onde ambas tabelas 
# sejam verdadeiras, ou seja:
# sem_letras = ~com_letras
# tem_2espacos = ~dif_2espacos
# sem_letras_E_tem_2espacos = sem_letras & tem_2espacos
# df = df[ sem_letras_E_tem_2espacos ].copy()
df = df[ ~tem_letras & ~dif_2espacos ].copy()

print("# df de linhas ( SEM letras AND COM 2 espacos ) na coluna 'Dimensões' :")
print(df)

Online Example - ideone

TL;DR;

df[ ~df['Dimensões'].str.contains(r'[A-Za-z]') &\
     (df['Dimensões'].str.count(' ') == 2) ]

Online Example - ideone

0

You can find the lines that only have numbers by taking out the spaces and testing if it’s numerical

df=df[ df["Dimensões"].apply( lambda x: x.replace(" ", "").isnumeric() ) ]

Browser other questions tagged

You are not signed in. Login or sign up in order to post.