pandas

Модификация DataFrame

Опубликовано

Добавляем колонки

Иногда нам может потребоваться добавить новые колонки к уже существующим записям в DataFrame. Это может быть совершенно новая информация или полученная в результате расчёта на основании уже имеющейся в нашей таблице.

Один из способов — это передать список с количеством элементов равным количеству рядов DataFrame. Допустим, к нашей таблице с телефонами мы хотим добавить ещё один столбец, который будет хранить информацию о количестве в магазине. Назовём столбец count.

import pandas as pd


df = pd.read_csv('iphones.csv', sep=';')
df['count'] = [15, 34, 28, 34, 56, 76, 34, 73, 39, 42, 56, 23, 23, 34, 53, 23, 54, 34, 23, 34]


print(df)

В результате у нас в DataFrame последним столбцом теперь хранится информация о количестве товара.

Если мы хотим добавить столбец и заполнить его одинаковыми значениями, не обязательно создавать список с одинаковыми элементами. Достаточно просто указать это значение.

df['has_esim'] = True

В результате работы этого кода у нас добавится столбец has_esim и заполнится значением True для каждого товара.

Но также мы можем создавать новые столбцы и наполнять их значениями уже на основании имеющейся у нас информации. Давайте создадим колонку, в которой будем хранить стоимость каждого продукта на период новогодней распродажи. Назовём колонку cost_with_discount, а размер скидки для каждого продукта у нас будет 10 процентов.

df['cost_with_discount'] = df.cost - df.cost * 0.1

В результате всех манипуляций мы получим вот такую таблицу.

Данные о скидке выглядят не очень-то красиво. Хочется отрезать дробную часть и получить только целое значение. Мы знаем, что в Python есть функция int(), которая поможет преобразовать в целочисленное значение. Для того, чтобы применить эту функцию ко всему столбцу, используем метод apply(), который в качестве параметра принимает название функции или метода, который необходимо применить к каждому значению в указанном столбце. Важно отметить, что метод apply() не изменяет сами данные в столбце, а возвращает новую серию данных, которую мы должны перезаписать.

df.cost_with_discount = df.cost_with_discount.apply(int)

Аргументом метода apply() могут выступать не только встроенные функции, но и те, что мы написали самостоятельно. Давайте представим, что перед нами стоит следующая задача. К началу новогодних распродаж на полках магазина каждой модели телефона должно быть не меньше 30 штук. Нужно узнать, каких моделей и сколько нам необходимо заказать, и записать эту информацию в столбец quantity_to_order. Проблема реализации этой задачи заключается в том, что некоторых моделей у нас присутствует сполна, поэтому представленный ниже код будет неверным.

df['quantity_to_order'] = 30 - df['count']

Так как в результате мы получим отрицательные значения вместо нуля у тех моделей, наличие которых больше 30.

Для того, чтобы реализовать поставленную задачу, для начала, объявим функцию eval_order, в параметр которой будет передано значение хранимое в ячейке таблицы. А после применим эту функцию к каждой ячейке столбца count и сохраним результат в новом столбце quantity_to_order.

def eval_order(value):
    if value > 30:
        quantity = 0
    else:
        quantity = 30 - value
    return quantity

df['quantity_to_order'] = df['count'].apply(eval_order)

Результат мы видим ниже

Точно такой же результат мы можем достичь используя функцию lambda.

df['quantity_to_order'] = df['count'].apply(lambda value: 0 if value > 30 else 30 - value)

Метод apply() можно применить не только к одному столбцу, но и к каждому ряду таблицы. При этом в функцию будет передан ряд. У нас есть столбец с полной стоимостью и со стоимостью со скидкой. Давайте на основе этих данных рассчитаем размер скидки.

def eval_discount(row):
    return row['cost'] - row['cost_with_discount']


df['amount_of_discount'] = df.apply(eval_discount, axis=1)

Обратите внимание на парамент axis=1, его необходимо передать, если мы хотим, чтобы в параметре row хранился именно ряд, а не отдельная ячейка из этого ряда.

Переименовывание колонок

Переименовать колонки поможет метод rename().

df.rename(
    columns={'amount_of_discount': 'discount',
    'cost': 'price'}, 
    inplace=True
)

Метод rename принимает словарь, ключ — имя колонки, которую нужно переименовать, значение — новое имя колонки. Если параметр inplace установлен в значение True, тогда изменится сам dataframe. Иначе будет возвращена копия dataframe с новыми именами колонок.

Если вам требуется переименовать все колонки, то проще обратится к свойству columns и перечислить новые имена колонок.

df.columns = ['new_name1', 'new_name2', 'new_name3']

Добавить комментарий

Ваш адрес email не будет опубликован.