Pandas установка значения столбца на основе значений из другого столбца
Дня начала сделаем небольшой датафрейм при помощи метода .from_dict ():
import pandas as pd
import numpy as np
df = pd.DataFrame.from_dict(
{
'Name': ['Jane', 'Melissa', 'John', 'Matt'],
'Age': [23, 45, 35, 64],
'Birth City': ['London', 'Paris', 'Toronto', 'Atlanta'],
'Gender': ['F', 'F', 'M', 'M']
}
)
И посмотрим, что есть в данном датафрейме
df
Использование Pandas.loc для установки столбца в Pandas
Функция Pandas.loc невероятно мощная! Вот очень хорошая статья по loc с разбором данной функции. Pandas loc создает булеву маску на основе условия. Иногда этим условием может быть просто выбор строк и столбцов, но его также можно использовать для фильтрации данных. К этим отфильтрованным рамкам данных могут быть применены значения.
Cинтаксис:
df.loc[df['column'] condition, 'new column name'] = 'value if condition is met'
Используя синтаксис выше, мы фильтруем датафрейм с помощью .loc, а затем присваиваем значение любой строке в столбце (или столбцах), где выполняется условие.
Давайте попробуем это сделать — присвоив строку 'Under 30' всем, чей возраст меньше 30 лет, а 'Over 30' — всем, кому 30 или больше:
df['Age Category'] = 'Over 30'
df.loc[df['Age'] < 30, 'Age Category'] = 'Under 30'
Результат:
Давайте посмотрим, что мы сделали:
- Мы присвоили строку 'Over 30' каждой записи в датафрейме.
- Затем мы используем .loc для создания булевой маски на столбце Age, чтобы отфильтровать строки, в которых возраст меньше 30 лет. Когда это условие выполняется, столбцу Возрастная категория присваивается новое значение 'Under 30'.
Но что происходит, когда у вас несколько условий? Можно, конечно, использовать .loc несколько раз, но это сложно для чтения и довольно неприятно для написания. Давайте посмотрим, как это можно сделать с помощью метода numpy.select ().
Использование Numpy Select для установки значений с помощью нескольких условий
Аналогично описанному выше методу использования .loc для создания условного столбца в Pandas, мы можем использовать метод numpy .select ().
Теперь, допустим, мы хотим применить несколько различных возрастных групп, как показано ниже:
- <20 years old,
- 20-39 years old,
- 40-59 years old,
- 60+ years old
Для этого создадим список условий и соответствующих значений для заполнения:
conditions = [
(df['Age'] < 20),
(df['Age'] >= 20) & (df['Age'] < 40),
(df['Age'] >= 40) & (df['Age'] < 59),
(df['Age'] >= 60)
]
values = ['<20 years old', '20-39 years old', '40-59 years old', '60+ years old']
df['Age Group'] = np.select(conditions, values)
Результат:
Давайте разберем, что происходит:
- Сначала мы определяем список условий, в котором указаны критерии. Следует отметить, что списки являются упорядоченными, то есть они должны располагаться в том порядке, в котором вы хотели бы видеть соответствующие значения.
- Затем мы определяем список значений, который соответствует значениям, которые вы хотели бы применить в новом столбце.
Я в своей обычной практике использую именно эти методы, вот статья в которой еще рассмотрены варианты с Apply и Map
Ошибка ValueError: Cannot mask with non-boolean array containing NA / NaN values
Итогда при работе с данными возникает ошибка: ValueError: Cannot mask with non-boolean array containing NA / NaN values, как ее исправить можно посмотреть в этой статье — https://appdividend.com/2023/01/29/cannot-mask-with-non-boolean-array-containing-na-nan-values/