Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

244
Visualizações
Cómo vectorizar lo siguiente, el apéndice es probablemente el cuello de botella

Tengo el siguiente marco de datos con dos columnas c1 y c2 , quiero agregar una nueva columna c3 basada en la siguiente lógica, lo que tengo funciona pero es lento, ¿alguien puede sugerir una forma de vectorizar esto?

  • Debe agruparse en función de c1 y c2 , luego, para cada grupo, la nueva columna c3 debe completarse secuencialmente a partir de values donde la clave es el valor de c1 y cada "subgrupo" tendrá valores posteriores, values[value_of_c1][idx] , donde idx es el "subgrupo", ejemplo a continuación
  • El primer grupo (1, 'a') , aquí c1 es 1 , el índice "subgrupo" "a" es 0 (primer subgrupo de 1), por lo que c3 para todas las filas de este grupo es values[1][0]
  • El segundo grupo (1, 'b') aquí, c1 sigue siendo 1 pero el "subgrupo" es "b" , por lo que el índice 1 (segundo subgrupo de 1), por lo que para todas las filas de este grupo, c3 es values[1][1]
  • El tercer grupo (2, 'y') aquí c1 ahora es 2 , "subgrupo" es "a" y el índice es 0 (primer subgrupo de 2), por lo que para todas las filas en este grupo c3 es values[2][0]
  • Y así
  • values tendrán los elementos necesarios para satisfacer esta lógica.

Código

 import pandas as pd df = pd.DataFrame( { "c1": [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], "c2": ["a", "a", "a", "b", "b", "b", "y", "y", "y", "z", "z", "z"], } ) new_df = pd.DataFrame() values = {1: ["a1", "a2"], 2: ["b1", "b2"]} for i, j in df.groupby("c1"): for idx, (k, l) in enumerate(j.groupby("c2")): l["c3"] = values[i][idx] new_df = new_df.append(l)

Salida (funciona pero mi código es lento)

 c1 c2 c3 0 1 a a1 1 1 a a1 2 1 a a1 3 1 b a2 4 1 b a2 5 1 b a2 6 2 y b1 7 2 y b1 8 2 y b1 9 2 z b2 10 2 z b2 11 2 z b2
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Si no le importa usar otra biblioteca, básicamente necesita etiquetar codificar dentro de sus grupos:

 from sklearn.preprocessing import LabelEncoder def le(x): return pd.DataFrame(LabelEncoder().fit_transform(x),index=x.index) df['idx'] = df.groupby('c1')['c2'].apply(le) df['c3'] = df.apply(lambda x:values[x['c1']][x['idx']],axis=1) c1 c2 idx c3 0 1 a 0 a1 1 1 a 0 a1 2 1 a 0 a1 3 1 b 1 a2 4 1 b 1 a2 5 1 b 1 a2 6 2 y 0 b1 7 2 y 0 b1 8 2 y 0 b1 9 2 z 1 b2 10 2 z 1 b2 11 2 z 1 b2

De lo contrario, se trata de usar pd.Categorical . Categorical , el mismo concepto que el anterior, solo que convierte dentro de cada grupo, la columna en una categoría y simplemente extrae el código:

 def le(x): return pd.DataFrame(pd.Categorical(x).codes,index=x.index)
over 4 years ago · Santiago Trujillo Relatório

0

In [203]: a = pd.DataFrame([[k, value, idx] for k,v in values.items() for idx,value in enumerate(v)], columns=['c1', 'c3', 'gr']) ...: b = df.assign(gr=df.groupby(['c1']).transform(lambda x: (x.ne(x.shift()).cumsum())- 1)) ...: print(b) ...: b.merge(a).drop(columns='gr') ...: # b c1 c2 gr 0 1 a 0 1 1 a 0 2 1 a 0 3 1 b 1 4 1 b 1 5 1 b 1 6 2 y 0 7 2 y 0 8 2 y 0 9 2 z 1 10 2 z 1 11 2 z 1 Out[203]: c1 c2 c3 0 1 a a1 1 1 a a1 2 1 a a1 3 1 b a2 4 1 b a2 5 1 b a2 6 2 y b1 7 2 y b1 8 2 y b1 9 2 z b2 10 2 z b2 11 2 z b2
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda