Мне кажется, это идеальный случай для 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)
Обновление: обобщение
Есть немного более обобщенный c Решение, в частности, когда у вас есть много столбцов для сравнения. Он использует np.argmax
, и это решение
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]
})
Сначала мы выбираем первое истинное значение в каждой строке
sel = df[["p1_dog", "p2_dog", "p3_dog"]].values.argmax(1)
Затем мы извлекаем матрицу с породой имена
mat = df[["p1", "p2", "p3"]].values
И мы наконец определим породу, используя ваши логики c
df["breed"] = mat[np.arange(mat.shape[0]), sel]