Un instantané de DF ressemble à ceci:

dataframe

idf=pd.DataFrame({'p1': {549: 'Staffordshire_bullterrier', 1374: 'kelpie', 641: 'Samoyed'},
 'p1_conf': {549: 0.6892590000000001, 1374: 0.519047, 641: 0.362596},
 'p1_dog': {549: True, 1374: True, 641: True},
 'p2': {549: 'Norwegian_elkhound', 1374: 'German_shepherd', 641: 'Eskimo_dog'},
 'p2_conf': {549: 0.026121, 1374: 0.296069, 641: 0.245395},
 'p2_dog': {549: True, 1374: True, 641: True},
 'p3': {549: 'American_Staffordshire_terrier',
  1374: 'dingo',
  641: 'Siberian_husky'},
 'p3_conf': {549: 0.0230747, 1374: 0.0610053, 641: 0.108232},
 'p3_dog': {549: True, 1374: False, 641: True},
 'breed': {549: 'Staffordshire_bullterrier', 1374: 'kelpie', 641: 'Samoyed'}})

Mon objectif est de rendre la race la plus confidentielle. par exemple: si p1_dog est vrai alors p1 doit être renvoyé. sinon ture, le deuxième plus sûr est p2_dog, alors p2 devrait être retourné, etc. bien sûr, je peux écrire quelque chose comme ceci:

idf['breed']=idf.query("p1_dog==1").p1
idf['breed']=idf['breed'].fillna(idf.query("p1_dog==0 and p2_dog==1").p2)
idf['breed']=idf['breed'].fillna(idf.query("p1_dog==0 and p2_dog==0 and p3_dog==1").p3)

Attendez le résultat est la dernière colonne «race», dont mon code ci-dessus peut servir le but. mais je pense que c'est répétitif et pas sec. et si j'ai des centaines de prédictions? quelle est la meilleure solution à cela? merci d'avance!

0
victorlifan 13 avril 2020 à 02:50

2 réponses

Meilleure réponse

Cela me semble un étui parfait pour np.select

np.select

import pandas as pd
import numpy as np

condlist = [df["p1_dog"]==1,
            ((df["p1_dog"]==0) & (df["p2_dog"]==1)),
            ((df["p1_dog"]==0) & (df["p2_dog"]==0) & (df["p3_dog"]==1))]

choicelist = [df["p1"], df["p2"], df["p3"]]

df["breed"] = np.select(condlist, choicelist)

Mise à jour: généralisation

Il existe une solution un peu plus générique en particulier lorsque vous avez de nombreuses colonnes à comparer. Il utilise np.argmax et cette solution

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {"p1":['Staffordshire_bullterrier', 'Samoyed', 'kelpie','dingo'],
     "p1_dog":[True, False, False, True],
     "p2": ['Norwegian_elkhound', 'Eskimo_dog', 'German_shepherd', 'kelpie'],
     "p2_dog":[False, True, False, True],
     "p3":['American_Staffordshire_terrier', 'Siberian_husky', 'dingo','Samoyed'],
     "p3_dog":[False, True, True, True]
     })

Nous sélectionnons d'abord le premier vrai de chaque ligne

sel = df[["p1_dog", "p2_dog", "p3_dog"]].values.argmax(1)

Ensuite, nous extrayons la matrice avec les noms de race

mat = df[["p1", "p2", "p3"]].values

Et nous définissons enfin la race en utilisant votre logique

df["breed"] = mat[np.arange(mat.shape[0]), sel]
1
rpanai 13 avril 2020 à 20:44

Pour chaque ligne de la trame de données, recherchez le nom de la colonne avec la valeur maximale

x = idf[['p1_conf','p2_conf','p3_conf']].idxmax(axis=1) 

Obtenir le nombre de colonnes avant le nom de la colonne à partir de x

breed_col = [idf.columns.get_loc(x.iloc[i])-1 for i in range(0, 3)] 

Extraire la valeur de la cellule correspondant à la ligne et à la colonne: i et race_col [i]

breed2 = []
for i in range(0,3):
    breed2.append(idf.iloc[i,breed_col[i]]) 

breed2_df = pd.DataFrame(breed2, columns = ['breed2'])

Réinitialiser les index pour permettre la concatentation des dataframes

idf.reset_index(drop=True, inplace=True) 
pd.concat([idf, breed2_df], axis=1)
0
dal233 22 avril 2020 à 00:33