1
resposta

Mesclando duas colunas em uma nova coluna de nome 'Classe' (dataframe Pandas)

df_downsampled[df_downsampled['attack_cat']=="DoS"]

Pega todo o dataframe 'df_downsampled' onde a coluna 'attack_cat' tem o valor DoS.

Existem duas colunas que quero "mesclar":

uma chama-se "Label" e tem valor 1 quando é ataque e 0 em caso contrário.

Na coluna 'attack_cat' me interessa apenas quando seu valor é 'DoS' (e nesta caso, o valor da coluna 'Label' é 1)

Objetivo:

Criar uma nova coluna de nome "Classe" que:

Pegue APENAS os valores da coluna 'Label' quando o valor de attack_cat for 'DoS' (e o valor de' Label' for 1)

(existem outros valores em 'attack_cat' que nao me interessam)

Pegue TODOS os valores da coluna 'Label ' quando for 0 (nao ataque)

Como fazer?

EU acho que

 new_df_downsampled = pd.concat([df_downsampled[df_downsampled['attack_cat']=="DoS"],df_downsampled[df‌_downsampled.Label==0]])

e

df_downsampled[(df_downsampled['attack_cat']=="DoS") | (df_downsampled['Label']==0) ]

resolveria, mas não consegui entender a diferença entre os dois!

1 resposta

Bom dia Edson,

Tudo em uma linha sempre é mais difícil de entender, não é considerado boa prática de programação em geral, repara como vai ajudar:

filtro_dos = df['attack_cat']=="DoS"
dos = df[filtro_dos]

filtro_nao_ataque = df.Label==0
nao_ataque = df[filtro_nao_ataque]
df_final = pd.concat([dos, nao_ataque])

Isto é, você filtrou os que são DOS, e os que são não ataque. Ai juntou novamente eles.

A segunda abordagem pega os que são de um tipo ou do outro:

df[(filtro_dos) | (filtro_nao_ataque) ]

Repara como variáveis ajudam a entender :)

Minha dica é usar a segunda abordagem. Na primeira você corre o risco de ter alguém classificado como label 0 e attack_cat=DOS e ele aparecerá duplicado na tabela resultante. Na segunda isso não acontece