AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78642298
Accepted
Giampaolo Levorato
Giampaolo Levorato
Asked: 2024-06-19 19:46:36 +0800 CST2024-06-19 19:46:36 +0800 CST 2024-06-19 19:46:36 +0800 CST

Verifique o seguinte elemento na lista no dataframe do pandas

  • 772

Eu criei o seguinte dataframe do pandas

import pandas as pd
import numpy as np

ds = {
      'col1' : 
          [
              ['U', 'U', 'U', 'U', 'U', 1, 0, 0, 0, 'U','U', None],
              [6, 5, 4, 3, 2],
              [0, 0, 0, 'U', 'U'],
              [0, 1, 'U', 'U', 'U'],
              [0, 'U', 'U', 'U', None]
              ]
      }

df = pd.DataFrame(data=ds)

O quadro de dados fica assim:

print(df)
                                      col1
0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]
1                          [6, 5, 4, 3, 2]
2                          [0, 0, 0, U, U]
3                          [0, 1, U, U, U]
4                       [0, U, U, U, None]

Para cada linha em col1, preciso verificar se cada elemento igual a Una lista é seguido (da esquerda para a direita) por qualquer valor além de Ue None: nesse caso eu criaria uma nova coluna (chamada iCount) com valor 1. Caso contrário, 0.

No exemplo acima, o dataframe resultante ficaria assim:

                                      col1 iCount
0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]      1
1                          [6, 5, 4, 3, 2]      0
2                          [0, 0, 0, U, U]      0
3                          [0, 1, U, U, U]      0
4                       [0, U, U, U, None]      0

Somente na primeira linha o valor Ué seguido por um valor que não é Unem None(é 1)

Eu tentei este código:

col5 = np.array(df['col1'])

for i in range(len(df)):
    iCount = 0

    for j in range(len(col5[i])-1):
        
        print(col5[i][j])
        
        if((col5[i][j] == "U") & ((col5[i][j+1] != None) & (col5[i][j+1] != "U"))):
            
            iCount += 1
            
        else:
            iCount = iCount
    

Mas recebo este dataframe (errado):

                                      col1  iCount
0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       0
1                          [6, 5, 4, 3, 2]       0
2                          [0, 0, 0, U, U]       0
3                          [0, 1, U, U, U]       0
4                       [0, U, U, U, None]       0

Alguém pode me ajudar por favor?

python
  • 5 5 respostas
  • 51 Views

5 respostas

  • Voted
  1. gtomer
    2024-06-19T19:55:37+08:002024-06-19T19:55:37+08:00

    Experimente isto:

    def calcUs(lst):
        cnt = 0
        for x, y in zip(lst, lst[1:]):
            if (x == 'U' and y != 'U' and y != None):
                cnt += 1
        return cnt
    df['iCount'] = df['col1'].apply(lambda x: calcUs(x))
    df
    

    Saída:

                                          col1  iCount
    0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                          [6, 5, 4, 3, 2]       0
    2                          [0, 0, 0, U, U]       0
    3                          [0, 1, U, U, U]       0
    4                       [0, U, U, U, None]       0
    
    • 2
  2. Best Answer
    mozway
    2024-06-19T19:55:39+08:002024-06-19T19:55:39+08:00

    Se você quiser apenas testar se há pelo menos um caso em que um não-None segue a U, use itertools.pairwisee any:

    from itertools import pairwise
    
    def count_after_U(lst):
        return int(any(a=='U' and b not in {'U', None} for a, b in pairwise(lst)))
    
    df['iCount'] = list(map(count_after_U, df['col1']))
    

    Saída:

                                                col1  iCount
    0        [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                                [6, 5, 4, 3, 2]       0
    2                                [0, 0, 0, U, U]       0
    3                                [0, 1, U, U, U]       0
    4                             [0, U, U, U, None]       0
    5  [U, U, 4, U, U, 1, 0, U, U, None, 1, U, None]       1
    6                                [U, None, 1, U]       0
    

    Se você também quiser verificar os outros valores até o próximo U, use uma função personalizada:

    def any_after_U(lst):
        flag = False
        for item in lst:
            if item == 'U':
                flag = True
            else:
                if flag and item is not None:
                    return 1
        return 0
    
    df['iCount'] = list(map(any_after_U, df['col1']))
    

    Exemplo:

                                                col1  iCount
    0        [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                                [6, 5, 4, 3, 2]       0
    2                                [0, 0, 0, U, U]       0
    3                                [0, 1, U, U, U]       0
    4                             [0, U, U, U, None]       0
    5  [U, U, 4, U, U, 1, 0, U, U, None, 1, U, None]       1
    6                                [U, None, 1, U]       1
    

    resposta original antes do esclarecimento

    abordagem 1: considerando apenas o primeiro item apósU

    IIUC, use uma função python personalizada:

    from itertools import pairwise
    
    def count_after_U(lst):
        return sum(a=='U' and b not in {'U', None} for a,b in pairwise(lst))
    
    df['iCount'] = list(map(count_after_U, df['col1']))
    

    Ou, para ser mais flexível com as condições:

    def count_after_U(lst):
        flag = False
        iCount = 0
        for item in lst:
            if item == 'U':
                flag = True
            else:
                if flag and item is not None:
                    iCount += 1
                flag = False
        return iCount
    
    df['iCount'] = list(map(count_after_U, df['col1']))
    

    Saída:

                                          col1  iCount
    0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                          [6, 5, 4, 3, 2]       0
    2                          [0, 0, 0, U, U]       0
    3                          [0, 1, U, U, U]       0
    4                       [0, U, U, U, None]       0
    

    Exemplo mais complexo:

                                                col1  iCount
    0        [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                                [6, 5, 4, 3, 2]       0
    2                                [0, 0, 0, U, U]       0
    3                                [0, 1, U, U, U]       0
    4                             [0, U, U, U, None]       0
    5  [U, U, 4, U, U, 1, 0, U, U, None, 1, U, None]       2
    

    abordagem 2: considerando todos os valores após U:

    Basta recuar o sinalizador redefinido na abordagem anterior para redefini-lo apenas se um valor ainda não tiver sido encontrado:

    def count_after_U(lst):
        flag = False
        iCount = 0
        for item in lst:
            if item == 'U':
                flag = True
            else:
                if flag and item is not None:
                    iCount += 1
                    flag = False
        return iCount
    
    df['iCount'] = list(map(count_after_U, df['col1']))
    

    Exemplo:

                                                col1  iCount
    0        [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                                [6, 5, 4, 3, 2]       0
    2                                [0, 0, 0, U, U]       0
    3                                [0, 1, U, U, U]       0
    4                             [0, U, U, U, None]       0
    5  [U, U, 4, U, U, 1, 0, U, U, None, 1, U, None]       3
    
    • 2
  3. Panda Kim
    2024-06-19T19:59:01+08:002024-06-19T19:59:01+08:00

    Código

    s = df['col1'].explode()
    s1 = s.groupby(level=0).shift(-1)
    cond = s.eq('U') & s1.notna() & s1.ne('U')
    df['icount'] = cond.groupby(level=0).any().astype('int')
    

    df

                                          col1  icount
    0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                          [6, 5, 4, 3, 2]       0
    2                          [0, 0, 0, U, U]       0
    3                          [0, 1, U, U, U]       0
    4                       [0, U, U, U, None]       0
    
    • 2
  4. e-motta
    2024-06-19T19:59:29+08:002024-06-19T19:59:29+08:00

    Você pode usar explode, groupbyno índice e depois agregar com uma soma de quando a condição for True:

    df["iCount"] = (
        df.explode("col1")
        .groupby(level=0)
        .agg(lambda x: ((x == "U") & (~x.shift(-1).isin(["U", None]))).sum())
    )
    
                                          col1  iCount
    0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                          [6, 5, 4, 3, 2]       0
    2                          [0, 0, 0, U, U]       0
    3                          [0, 1, U, U, U]       0
    4                       [0, U, U, U, None]       0
    

    Se você precisar 'iCount'conter apenas 0ou 1, e não uma soma dos valores que correspondem à condição, em vez de sumvocê pode usar any.astype(int):

    df["iCount"] = (
        df.explode("col1")
        .groupby(level=0)
        .agg(lambda x: ((x == "U") & (~x.shift(-1).isin(["U", None]))).any().astype(int))
    )
    
                                          col1  iCount
    0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                          [6, 5, 4, 3, 2]       0
    2                          [0, 0, 0, U, U]       0
    3                          [0, 1, U, U, U]       0
    4                 [0, U, 0, U, 0, U, None]       1
    
    • 2
  5. U13-Forward
    2024-06-19T20:02:21+08:002024-06-19T20:02:21+08:00

    Use np.vecorizecom uma função e pd.Series:

    def func(x):
        lst = pd.Series(x)
        return int(lst[lst.eq('U') & (~lst.shift(-1).isin({'U', None}))].any())
    
    df['iCount'] = np.vectorize(func)(df['col1'])
    

    Ou crie uma função minimalista com zip.

    Parece que o OP mencionou, os valores só podem ser 1ou 0.

    def func(x):
        lst = zip(x, x[1:])
        for a, b in lst:
            if (a == 'U') and (b not in {'U', None}):
                return 1
        return 0
    
    df['iCount'] = np.vectorize(func)(df['col1'])
    

    Saída:

                                          col1  iCount
    0  [U, U, U, U, U, 1, 0, 0, 0, U, U, None]       1
    1                          [6, 5, 4, 3, 2]       0
    2                          [0, 0, 0, U, U]       0
    3                          [0, 1, U, U, U]       0
    4                       [0, U, U, U, None]       0
    
    • 2

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve