Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Filtrar linhas que contenham valor X na coluna 1 ou na coluna 2

Estou praticando aqui o Numpy, mas fiquei preso em um código.

Eu criei um array (Dataset) de tamanho a partir de resultados de futebol.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeEu criei um novo array O_M (Official Matches) para filtrar apenas jogos oficiais

O_M = Dataset[Dataset[:,5] != 'Friendly', :]

Meu objetivo agora é filtrar apenas jogos da seleção brasileira, mas eu só consigo filtrar uma coluna por vez Brasil como Mandante: 'O_M_Home_BR = O_M[O_M[:,1] == 'Brazil', :]'

ou Brasil como Visitante: O_M_Away_BR = O_M[O_M[:,2] == 'Brazil', :]

Eu queria fazer um comando que criasse um array tanto o Brasil como mandante quanto como visitante, provavelmente utilizando or

6 respostas

Oi, Arthur! Tudo bem contigo?

No primeiro momento temos que definir a diferença entre numpy array, dataset e DataFrame.

  • Numpy Array: É um conjunto de valores todos do mesmo tipo agrupados e acessados pelo índice. Podem ter mais de uma dimensão, mas ainda devem possuir o mesmo tipo de dado (numérico, booleano, string...)

  • Dataset: É sua base de dados. É o arquivo csv, por exemplo.

  • DataFrame: É uma tabela de dados em formato retangular e possui uma coleção ordenada de colunas, onde cada coluna pode ter um tipo de valor diferente (numérico, booleano, string...)

E um conceito que vai aparecer mais pra frente que é de Series:

  • Series: é um objeto do tipo array de apenas uma dimensão que possui uma sequência de valores e um array de rótulos que chamamos de índice. Pode pensar neles como um DataFrame de apenas uma coluna, pois um DataFrame são várias Series juntas.

Então o DataFrame pode ser criado a partir de seu numpy array. Abaixo um exemplo de como podemos fazer isso:

import pandas as pd
import numpy as np

teste = pd.DataFrame(np.arange(16).reshape((4,4)))
teste

Saída:

0123
00123
14567
2891011
312131415

Também pode ser criado a partir também do seu dataset, fazendo a importação do seu arquivo csv (ou outro tipo de arquivo), conforme nosso exemplo um pouco mais abaixo.

Como o que você tem é um DataFrame (Observe que são vários tipos de dados, a coluna home_score são inteiros, já coluna city são strings) a forma que você está tentando acessá-lo não é a correta.

Para acessar as colunas do DataFrame basta apenas passar seu nome e a coluna.

nome_do_dataframe['nome_da_coluna']

Vamos agora ao exemplo que você está tentando fazer, onde utilizaremos a abordagem do ou, que é escrito pelo símbolo: |. Há algumas abordagens para o que você está tentando fazer, vou mostrar uma delas, tudo bem?

import pandas as pd
import numpy as np

dataset = pd.read_csv('results.csv')
dataset.head()

Saída:

datehome_teamaway_teamhome_scoreaway_scoretournamentcitycountryneutral
01872-11-30ScotlandEngland00FriendlyGlasgowScotlandFalse
11873-03-08EnglandScotland42FriendlyLondonEnglandFalse
21874-03-07ScotlandEngland21FriendlyGlasgowScotlandFalse
31875-03-06EnglandScotland22FriendlyLondonEnglandFalse
41876-03-04ScotlandEngland30FriendlyGlasgowScotlandFalse

No código acima estamos apenas fazendo a importação do dataset, que está em csv, e colocando em um DataFrame que chamamos de dataset. Encontrei o dataset usado por você nesse link.

O_M = dataset['tournament'] != 'Friendly'
dataset_sem_friendly = dataset[O_M]
dataset_sem_friendly.head()

Saída:

datehome_teamaway_teamhome_scoreaway_scoretournamentcitycountryneutral
291884-01-26Northern IrelandScotland05British ChampionshipBelfastRepublic of IrelandFalse
301884-02-09WalesNorthern Ireland60British ChampionshipWrexhamWalesFalse
311884-02-23Northern IrelandEngland18British ChampionshipBelfastRepublic of IrelandFalse
321884-03-15ScotlandEngland10British ChampionshipGlasgowScotlandFalse
331884-03-17WalesEngland04British ChampionshipWrexhamWalesFalse

No código acima estamos fazendo a seleção de todas as linhas do nosso DataFrame que não possuem Friendly na coluna tournament, fazemos então um novo DataFrame (dataset_sem_friendly) com base nessa seleção.

solução!

Só um detalhe, quando fazemos O_M = dataset['tournament'] != 'Friendly' nos é retornado uma Series de booleanos, e a partir dessa Series é feita a filtragem dataset[O_M], onde é True ( ou seja a linha é diferente de 'Friendly' na coluna tournament ) é colocado o valor emdataset_sem_friendly, e onde é False a nossa seleção ignora.

selecao = (dataset_sem_friendly['home_team'] == 'Brazil') | (dataset_sem_friendly['away_team'] == 'Brazil')
dataset_sem_friendly[selecao].head()

Saída:

datehome_teamaway_teamhome_scoreaway_scoretournamentcitycountryneutral
4111914-09-27ArgentinaBrazil01Copa RocaBuenos AiresArgentinaFalse
4411916-07-08BrazilChile11Copa AméricaBuenos AiresArgentinaTrue
4421916-07-10ArgentinaBrazil11Copa AméricaBuenos AiresArgentinaFalse
4441916-07-12BrazilUruguay12Copa AméricaBuenos AiresArgentinaTrue
4721917-10-03ArgentinaBrazil42Copa AméricaMontevideoUruguayTrue

No código acima estamos fazendo outra seleção, dessa vez para determinar no nosso DataFrame dataset_sem_friendly (Que já está sem os jogos que são Friendly) as linhas que possuem o Brasil como mandante (home_team) ou (|) como visitante (away team). A variável selecao é quem está fazendo esse papel. Ela é semelhante à variável O_M, é uma Series que contém valores booleanos onde será True caso o Brasil apareça na coluna home_team ou (|) away team, e False caso não apareça. E então fizemos a filtragem (dataset_sem_friendly[selecao]) com base nessa seleção. Com isso temos todos os jogos que são diferentes de Friendly, e que possuem o Brasil como mandante ou visitante, conforme a saída acima.

Deixo como sugestão o curso Python Pandas: Tratando e analisando dados .

Espero ter te ajudado nessa e qualquer dúvida estou sempre à disposição.

:)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Muito obrigado, Bruno!

Após essa dúvida, eu comecei a introdução ao pandas e realmente fica bem mais fácil tratar isso com essa biblioteca.

Bruno,

Eu percebi que esse código não está correto! A lista saiu apenas 5 jogos do Brazil sem ser amistosos.

Quando na verdade existem nessa base de dados 569 jogos oficiais da seleção brasileira. O que pode estar divergindo?

Oie, Arthur! Tudo tranquilo?

Na lista saiu apenas os 5 primeiros jogos pois usou-se o método head(), que se olharmos a documentação veremos que existe um parâmetro chamado n, que é o número de linhas que queremos ver, por padrão esse valor é 5, por isso nos é retornado apenas os 5 primeiros valores encontrados.

# Documentação:
DataFrame.head(n=5)

Para ter acesso a todas as 569 linhas dos jogos oficiais da seleção brasileira basta retirar o método .head(), conforme código abaixo:

selecao = (dataset_sem_friendly['home_team'] == 'Brazil') | (dataset_sem_friendly['away_team'] == 'Brazil')
dataset_sem_friendly[selecao]

Espero que tenha te ajudado.

Caso ainda persista alguma dúvida é só mandar mensagem por aqui.

:)

Descobri o que era. Eu não tava entendendo esse .head().

O código estava mostrando só as primeiras linhas.

Edit: só vi depois que você já tinha respondido isso rsrs

Obrigado!