Я хочу , чтобы применить свою пользовательскую функцию (она использует если-иначе лестница) в этих шести колонн ( ERI_Hispanic
, ERI_AmerInd_AKNatv
, ERI_Asian
, ERI_Black_Afr.Amer
, ERI_HI_PacIsl
, ERI_White
) в каждой строке моего dataframe.
Я пробовал разные методы из других вопросов, но все еще не могу найти правильный ответ для моей проблемы. Критическим моментом является то, что если человек считается латиноамериканцем, его нельзя считать ничем другим. Даже если у них есть «1» в другой колонке этнической принадлежности, они по-прежнему считаются латиноамериканцами, а не двумя или более расами. Точно так же, если сумма всех столбцов ERI больше 1, они считаются двумя или более расами и не могут считаться уникальной этнической принадлежностью (кроме испаноязычных). Надеюсь, это имеет смысл. Любая помощь будет оценена.
Это почти как цикл for для каждой строки, и если каждая запись соответствует критерию, они добавляются в один список и удаляются из оригинала.
Из приведенного ниже кадра данных мне нужно вычислить новый столбец на основе следующей спецификации в SQL:
========================= КРИТЕРИИ ======================== =======
IF [ERI_Hispanic] = 1 THEN RETURN “Hispanic”
ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN “Two or More”
ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN “A/I AK Native”
ELSE IF [ERI_Asian] = 1 THEN RETURN “Asian”
ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN “Black/AA”
ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN “Haw/Pac Isl.”
ELSE IF [ERI_White] = 1 THEN RETURN “White”
Комментарий: если флаг ERI для латиноамериканца имеет значение «Истина» (1), сотрудник классифицируется как «латиноамериканец»
Комментарий: если задано более 1 флага испанского языка, не являющегося латиноамериканским, вернуть «Два или более»
====================== DATAFRAME ===========================
lname fname rno_cd eri_afr_amer eri_asian eri_hawaiian eri_hispanic eri_nat_amer eri_white rno_defined
0 MOST JEFF E 0 0 0 0 0 1 White
1 CRUISE TOM E 0 0 0 1 0 0 White
2 DEPP JOHNNY 0 0 0 0 0 1 Unknown
3 DICAP LEO 0 0 0 0 0 1 Unknown
4 BRANDO MARLON E 0 0 0 0 0 0 White
5 HANKS TOM 0 0 0 0 0 1 Unknown
6 DENIRO ROBERT E 0 1 0 0 0 1 White
7 PACINO AL E 0 0 0 0 0 1 White
8 WILLIAMS ROBIN E 0 0 1 0 0 0 White
9 EASTWOOD CLINT E 0 0 0 0 0 1 White
Ответы:
Хорошо, два шага к этому - сначала написать функцию, которая выполняет перевод, который вы хотите - я собрал пример на основе вашего псевдокода:
Возможно, вы захотите пройти через это, но, похоже, уловка - обратите внимание, что входящий в функцию параметр считается объектом Series, помеченным как «строка».
Затем используйте функцию apply в пандах, чтобы применить функцию - например,
Обратите внимание на спецификатор axis = 1, это означает, что приложение выполняется на уровне строки, а не на уровне столбца. Результаты здесь:
Если вы довольны этими результатами, запустите их снова, сохранив результаты в новом столбце в исходном кадре данных.
Результирующий кадр данных выглядит следующим образом (прокрутите вправо, чтобы увидеть новый столбец):
источник
df.apply(label_race, axis=1)
return 'Other'
строку, наreturn row['rno_defined']
которую следует подставьте значение из этого столбца в тех случаях, когда набор операторов if / then не находит соответствия (то есть, где в настоящий момент вы видите «Other»).df.apply(lambda row: label_race (row),axis=1)
доdf.apply(label_race, axis=1)
Так как это первый результат Google для «нового столбца панд от других», вот простой пример:
Если вы получите,
SettingWithCopyWarning
вы можете сделать это так же:Источник: https://stackoverflow.com/a/12555510/243392
И если имя вашего столбца содержит пробелы, вы можете использовать синтаксис, подобный следующему:
А вот документацию для подачи заявки и назначения .
источник
SettingWithCopyWarning
когда я это делаю.df['c'] = df.apply(lambda row: row.a + row.b, axis=1)
Это реальная проблема здесь, или я не должен беспокоиться об этом?Приведенные выше ответы совершенно верны, но существует векторизованное решение в форме
numpy.select
. Это позволяет вам определять условия, а затем определять выходные данные для этих условий, гораздо более эффективно, чем с помощьюapply
:Сначала определите условия:
Теперь определите соответствующие выходы:
Наконец, используя
numpy.select
:Почему следует
numpy.select
использовать болееapply
? Вот некоторые проверки производительности:Использование
numpy.select
дает нам значительно улучшенную производительность, и расхождение будет только увеличиваться по мере роста данных.источник
.apply()
принимает функцию в качестве первого параметра; передать вlabel_race
функцию так:Вам не нужно делать лямбда-функцию для передачи функции.
источник
попробуй это,
O / P:
использовать
.loc
вместоapply
.это улучшает векторизацию.
.loc
работает простым способом, маскирует строки на основе условия, применяет значения к стоп-строкам.для более подробной информации посетите сайт .loc
Показатели эффективности:
Принятый ответ:
Мой предложенный ответ:
источник