Общественный номер: 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
Суммировать
В приведенном выше примере мы обнаруживаем, что:
- DataFrame, сгенерированный функцией assign, не изменит исходные данные, это новый DataFrame.
- Функция назначения может работать с несколькими именами столбцов одновременно, а имена столбцов, сгенерированные в середине, могут использоваться напрямую.
- Основное различие между назначением и применением заключается в том, что первое не изменяет исходные данные, а функция применения добавляет новые столбцы на основе исходных данных.