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 / 79377042
Accepted
Ishigami
Ishigami
Asked: 2025-01-22 16:52:55 +0800 CST2025-01-22 16:52:55 +0800 CST 2025-01-22 16:52:55 +0800 CST

Como gerar uma nova coluna no dataframe que indique as colunas com resultados positivos?

  • 772

Tenho um dataframe que se parece com:

ID   f_1   f_2   f_3
1    1     0     1
2    0     1     1
3    1     1     0
4    1     0     1
5    0     1     1   

Não tenho a mínima ideia de como começar. E também meu dataframe original é bem grande (~1M linhas) e, portanto, um método rápido seria muito apreciado.

e eu gostaria de gerar uma nova coluna Resultque registra o par de f's que tem 1 neles, ou seja

ID   f_1   f_2   f_3   Result
1    1     0     1     1_3
2    0     1     1     2_3
3    1     1     0     1_2
4    1     0     1     1_3
5    0     1     1     2_3
pandas
  • 1 1 respostas
  • 57 Views

1 respostas

  • Voted
  1. Best Answer
    mozway
    2025-01-22T16:54:57+08:002025-01-22T16:54:57+08:00

    Você pode usar um dotproduto depois de renomear as colunas com str.replace/ str.removeprefix:

    tmp = df.drop(columns='ID')
    df['Result'] = (tmp @ tmp.columns.str.replace('^f', '', regex=True)).str[1:]
    
    # variant
    df['Result'] = (tmp @ tmp.columns.str.removeprefix('f')).str[1:]
    

    Alternativamente, uma abordagem mais clássica de pandas (muito mais lenta) com remodelagem ( melt), filtragem (com query), e groupby.agg:

    df['Result'] = (df.melt('ID', ignore_index=False).query('value == 1')
                      .groupby(level=0)['variable']
                      .agg(lambda x: '_'.join(x.str.extract('_(\d+)', expand=False)))
                   )
    

    Ou com stack:

    s = df.drop(columns='ID').stack()
    df['Result'] = (s[s==1].reset_index(-1).groupby(level=0)['level_1']
                    .agg(lambda x: '_'.join(x.str.extract('_(\d+)', expand=False)))
                   )
    

    Saída:

       ID  f_1  f_2  f_3 Result
    0   1    1    0    1    1_3
    1   2    0    1    1    2_3
    2   3    1    1    0    1_2
    3   4    1    0    1    1_3
    4   5    0    1    1    2_3
    

    Horários

    Em 20K linhas:

    # dot product
    2.96 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    # melt + groupby.agg
    965 ms ± 59.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    # stack + groupby.agg
    928 ms ± 43.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    Em 1M linhas:

    # dot product
    359 ms ± 56.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    # melt/stack + groupby.agg
    did not run under a few minutes
    
    • 2

relate perguntas

  • Extraia a string da linha duplicada, remova a duplicata, forneça a contagem de strings [duplicada]

  • percorrendo colunas para gerar countplot () seaborn

  • Como posso obter o máximo de cada linha em uma coluna de índice

  • Crie uma matriz dask com pyarrow dtype

  • Divida as entradas no dataframe [duplicado]

Sidebar

Stats

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

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

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

    • 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

    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
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +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

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