2
respostas

Dúvidas com iterações em pandas e numpy

Boa tarde!!

Tenho que fazer uma tarefa aqui no trabalho, mas estou quebrando a cabeça e não consigo sair do lugar. As iterações dentro do pandas e do numpy não fazem muito sentido para mim, ou eu ainda não peguei elas nem 10%.

Eu tenho o seguinte df, que é apenas um exemplo (alguns dados foram excluidos pois são confidenciais): Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Eu preciso fazer o seguinte:

  • Pegar o primeiro ID dessa lista.
  • Roda a lista toda procurando pelo mesmo ID, e ao encontrar ele precisa verificar se esse ID existe com as datas de hoje e de ontem .
  • Caso não, passar para o próximo ID.
  • Caso sim, verificar se alguma das TAGs bate uma com a outra.
  • Caso sim, criar um novo campo que receba "Sim"
  • Caso não, passar para o próximo ID e criar um novo campo que receba "Não"

Eu não consigo criar a lógica para fazer isso rodar.

Eu crio uma lista com os IDs únicos e faço um for nessa lista? Mas ao mesmo tempo eu já vi que não deveria fazer for pois o pandas não é feito pra isso. Deveria usar o NumPy e utilizar vetorização, mas eu fico babando ao tentar entender tudo isso.

Eu já consegui criar essa lógica no excel, mas fica tudo muito manual e gostaria de automatizar, agilizar o processo.

Algum gênio do pandas/numpy/python pode me ajudar? Gracias!

2 respostas

Para fazer o que você deseja, uma opção é usar o método groupby do Pandas para agrupar os dados pelo ID e, em seguida, aplicar uma função a cada grupo.

A função pode ser escrita da seguinte maneira:

def verifica_tags(group):
    hoje = pd.to_datetime('today').date()
    ontem = pd.to_datetime('today').date() - pd.Timedelta(days=1)
    existe_hoje = group['data'].isin([hoje]).any()
    existe_ontem = group['data'].isin([ontem]).any()
    if existe_hoje or existe_ontem:
        if group['tag'].nunique() == 1:
            return "Sim"
        else:
            return "Não"
    else:
        return "Não"

Essa função verifica se existe pelo menos um registro com a data de hoje ou de ontem e, caso exista, verifica se todos os valores da coluna tag são iguais. Se forem iguais, retorna "Sim", senão retorna "Não". Se não existir nenhum registro com essas datas, retorna "Não".

Para aplicar essa função aos grupos, basta fazer:

df['resultado'] = df.groupby('ID').apply(verifica_tags)

Espero que isso ajude! Qualquer dúvida, só falar.

Fala Diogo, bom dia!

Quase isso meu caro, mas a ideia é que eu conseguisse pegar o dia e dia -1 pela planilha e não precisar setar manualmente. Até por que possuo dados que vão do dia 02/01 até o dia 07/01. Então eu verificaria se apareceu no dia 02/01. Caso sim, verificaria novamente no dia 03/01, e assim sucessivamente.