pandas создает новый столбец на основе значений из других столбцов / применяет функцию к нескольким столбцам по строкам
Я хочу применить мою пользовательскую функцию (она использует лестницу if-else) к этим шести столбцам (ERI_Hispanic
, ERI_AmerInd_AKNatv
, ERI_Asian
, ERI_Black_Afr.Amer
, ERI_HI_PacIsl
, ERI_White
) в каждой строке моего датафрейма.
Я пробовал различные методы из других вопросов, но все еще не могу найти правильный ответ для моей проблемы. Критическая часть этой задачи заключается в том, что если человек считается испаноязычным, он не может считаться никем другим. Даже если у них есть "1" в другой колонке этнической принадлежности, они все равно считаются латиноамериканцами, а не представителями двух или более рас. Аналогично, если сумма всех столбцов ERI больше 1, они считаются представителями двух или более рас и не могут быть учтены как уникальная этническая принадлежность (кроме испаноязычной). Надеюсь, это имеет смысл. Любая помощь будет высоко оценена.
Это почти как выполнение цикла for по каждой строке, и если каждая запись соответствует критерию, они добавляются в один список и исключаются из исходного.
Из приведенного ниже массива данных мне нужно вычислить новый столбец на основе следующей спецификации в SQL:
========================= CRITERIA ===============================
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 для испаноязычного равен True (1), сотрудник классифицируется как "испаноязычный".
Комментарий: Если истинно более 1 флага ERI для неиспаноязычных, верните "Два или более".
====================== 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 с меткой "row".
Затем используйте функцию apply в pandas, чтобы применить функцию - например.
Обратите внимание на спецификатор axis=1, это означает, что применение выполняется на уровне строки, а не столбца. Результаты приведены здесь:
Если вы довольны этими результатами, запустите программу снова, сохранив результаты в новый столбец в исходном фрейме данных.
Полученный кадр выглядит следующим образом (прокрутите страницу вправо, чтобы увидеть новый столбец):
Поскольку это первый результат Google для 'pandas new column from others', вот'простой пример:
Если вы получаете предупреждение
SettingWithCopyWarning
, вы можете сделать это и таким способом:Источник: https://stackoverflow.com/a/12555510/243392
А если имя вашего столбца включает пробелы, вы можете использовать такой синтаксис:
А вот документация для apply и assign.
Вышеуказанные ответы являются вполне действительными, а решение векторизация существует, в форме и NumPy.выберите`. Это позволяет определить условия, определите выходы на тех условиях, гораздо более эффективно, чем использование "применить":
Во-первых, определить условия:
Теперь, определить соответствующие мероприятия:
Наконец, с помощью библиотеки numpy.выберите`:
<!- ->
Зачем `и NumPy.выберите использоваться по "применить"? Вот некоторые проверка производительности:
С помощью библиотеки numpy.выберите` дает нам значительно улучшена производительность, и разрыв будет только увеличиваться, так как данные растет.
.apply()
принимает функцию в качестве первого параметра; передайте функциюlabel_race
таким образом:Вам не нужно создавать лямбда-функцию, чтобы передать функцию.
попробуйте это,
О/Р:
использование
.Лок
вместоприменить
.он улучшает векторизации.
`.работает ЛОК в простой форме, строк, маски в зависимости от состояния, применить значения заморозить строк.
для более подробной информации посетите, <а href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html"> .Лок документы </а>
Показатели эффективности:
Принято Отвечать:
Предлагаемый Мною Ответ: