Графические панды назначают функцию

Python pandas

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

В этой статье представлена ​​очень полезная функция в библиотеке Pandas:assign

Когда мы обрабатываем данные, иногда нам нужно вычислить новый столбец на основе определенного столбца для последующего использования, что эквивалентно получению нового столбца на основе известного столбца, В это время функция assign очень удобна. Следующий пример иллюстрирует использование функции.

Статьи о пандах

Эта статья является 21-й в серии статей о пандах, в основном разделенных на 3 категории:

Основная часть: статьи 1–16, в основном знакомящие с основными и распространенными операциями в Pandas, такими как создание данных, поисковый запрос, ранжирование и сортировка, обработка отсутствующих значений/дублирующих значений и другие общие операции обработки данных.

Расширенная часть: глава 17 начинает объяснять расширенные методы работы в Pandas.

Сравните SQL, изучите Pandas: сравните операции SQL и Pandas, чтобы узнать

параметр

Функция назначения имеет только один параметр: DataFrame.assign(**kwargs).

**kwargs: dict of {str: callable or Series}

Несколько замечаний по параметрам:

  • Имена столбцов являются ключевыми словами
  • Если имена столбцов можно вызывать, они будут рассчитаны в DataFrame и назначены новому столбцу.
  • Если имя столбца нельзя вызвать (например, ряд, скалярный скаляр или массив массивов), назначьте его напрямую.

Наконец, возвращаемое значение этой функции представляет собой новый DataFrame, содержащий все существующие и вновь созданные столбцы.

библиотека импорта

import pandas as pd
import numpy as np
# 模拟数据

df = pd.DataFrame({
  "col1":[12, 16, 18],
  "col2":["xiaoming","peter", "mike"]})

df
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike

пример

Когда значение можно вызвать, мы выполняем расчет непосредственно во фрейме данных:

Способ 1: вызов фрейма данных напрямую

# 方式1:数据框df上调用
# 使用数据框df的col1属性,生成col3

df.assign(col3=lambda x: x.col1 / 2 + 20)  
col1 col2 col3
0 12 xiaoming 26.0
1 16 peter 28.0
2 18 mike 29.0

Мы можем посмотреть на исходный df и увидеть, что он не изменился.

df  # 原数据框不变的
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike

Манипулировать данными типа string:

df.assign(col3=df["col2"].str.upper())

Способ 2: вызов данных серии

Такого же поведения можно добиться, напрямую ссылаясь на существующую серию или последовательность:

# 方式2:调用现有的Series来计算

df.assign(col4=df["col1"] * 3 / 4 + 25)

df  # 原数据不变
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike

В Python 3.6+ мы можем создать несколько столбцов в одном назначении, и один из столбцов также может зависеть от другого столбца, определенного в том же назначении, то естьНовый столбец, сгенерированный в середине, можно использовать напрямую.:

df.assign(
    col5=lambda x: x["col1"] / 2 + 10,         
    col6=lambda x: x["col5"] * 5,  # 在col6计算中直接使用col5        
    col7=lambda x: x.col2.str.upper(),         
    col8=lambda x: x.col7.str.title()  # col8中使用col7
)

df   # 原数据不变
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike

Если мы переназначим существующий столбец, значение существующего столбца будет перезаписано:

df.assign(col1=df["col1"] / 2)  # col1直接被覆盖
col1 col2
0 6.0 xiaoming
1 8.0 peter
2 9.0 mike

Функция применения контраста

Мы также можем использовать функцию применения в пандах для достижения

df  # 原数据
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike

Чтобы сгенерировать копию, мы работаем непосредственно с копией:

df1 = df.copy()  # 生成副本,直接在副本上操作
df2 = df.copy()

df1
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike
df1.assign(col3=lambda x: x.col1 / 2 + 20)  
col1 col2 col3
0 12 xiaoming 26.0
1 16 peter 28.0
2 18 mike 29.0
df1  # df1保持不变
col1 col2
0 12 xiaoming
1 16 peter
2 18 mike
df1["col3"] = df1["col1"].apply(lambda x:x / 2 + 20)

df1  # df1已经发生了变化
col1 col2 col3
0 12 xiaoming 26.0
1 16 peter 28.0
2 18 mike 29.0

Мы обнаружили, что: благодаря операции функции назначения исходные данные не изменились, но данные, управляемые функцией применения, изменились.

BMI

Наконец, смоделируйте данные и рассчитайте ИМТ каждого человека.

Индекс массы тела, индекс ИМТ, называемый индексом массы тела, является стандартом, обычно используемым на международном уровне для измерения степени ожирения и здоровья тела.

вес и рост

Среди них: единица веса – кг, а единица роста – м.

df2 = pd.DataFrame({
    "name":["xiaoming","xiaohong","xiaosu"],
    "weight":[78,65,87],
    "height":[1.82,1.75,1.89]
})

df2
name weight height
0 xiaoming 78 1.82
1 xiaohong 65 1.75
2 xiaosu 87 1.89
# 使用assign函数实现

df2.assign(BMI=df2["weight"] / (df2["height"] ** 2))

df2 # 不变
name weight height
0 xiaoming 78 1.82
1 xiaohong 65 1.75
2 xiaosu 87 1.89
df2["BMI"] = df2["weight"] / (df2["height"] ** 2)

df2  # df2生成了一个新的列:BMI

Суммировать

В приведенном выше примере мы обнаруживаем, что:

  1. DataFrame, сгенерированный функцией assign, не изменит исходные данные, это новый DataFrame.
  2. Функция назначения может работать с несколькими именами столбцов одновременно, а имена столбцов, сгенерированные в середине, могут использоваться напрямую.
  3. Основное различие между назначением и применением заключается в том, что первое не изменяет исходные данные, а функция применения добавляет новые столбцы на основе исходных данных.