Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте
При ежедневной обработке данных часто бывает необходимоDataFrame
Выполнять построчные, столбцовые и поэлементные операции, соответствующие этим операциям, в Pandasmap
,apply
иapplymap
Он может решить большинство этих потребностей в обработке данных. Эта статья начинается скейсслучайныйдиаграммаметод, мы представим три метода в деталях.Принцип реализации, я считаю, что после прочтения этой статьи как Xiaobai, так и опытные пользователи Pandas получат более глубокое представление об этих трех методах.
Набор данных, показанный в этой статье, создан путем моделирования. Если вы хотите попрактиковаться, вы можете создать его, нажав код ниже.
boolean=[True,False]
gender=["男","女"]
color=["white","black","yellow"]
data=pd.DataFrame({
"height":np.random.randint(150,190,100),
"weight":np.random.randint(40,90,100),
"smoker":[boolean[x] for x in np.random.randint(0,2,100)],
"gender":[gender[x] for x in np.random.randint(0,2,100)],
"age":np.random.randint(15,90,100),
"color":[color[x] for x in np.random.randint(0,len(color),100) ]
}
)
Набор данных показан ниже со столбцами, представляющими рост, вес, курение, пол, возраст и цвет кожи.
Обработка серийных данных
использование карты
Если вам нужно централизовать данныеgender
Мужской столбец заменяется на 1, а женский на 0. Как это сделать? Определенно не реализовано с циклом for, используйтеSeries.map()
Это можно сделать очень легко, по крайней мере, с одной строкой кода.
#①使用字典进行映射
data["gender"] = data["gender"].map({"男":1, "女":0})
#②使用函数
def gender_map(x):
gender = 1 if x == "男" else 0
return gender
#注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)
Тотmap
Как это работает на практике? Пожалуйста, смотрите диаграмму ниже (для удобства представления перехватываются только первые 10 фрагментов данных)
Используете ли вы словарь или функцию для отображения,map
Метод заключается в том, чтобы поместить соответствующие данныеодин за другим в качестве параметровПередайте его в словарь или функцию, чтобы получить сопоставленное значение.
apply
В то же время объект Series также имеетapply
метод,apply
как работает метод иmap
Метод аналогичен, разница в том, чтоapply
Возможность передачи более сложных функций. Как понять это? Взгляните на примеры ниже.
Предполагая, что в процессе данных статистики возрастage
Столбец имеет большую ошибку и нуждается в корректировке (плюс-минус значение) из-за этого плюс-минуснеизвестный, поэтому при определении функции нужно добавить еще один параметрbias
, затем используйтеmap
метод неработоспособен (переход вmap
функция может принимать только один параметр),apply
способ может решить эту проблему.
def apply_age(x,bias):
return x+bias
#以元组的方式传入额外的参数
data["age"] = data["age"].apply(apply_age,args=(-3,))
Видно, что столбец age уменьшился на 3. Конечно, это всего лишь простой пример, когда требуется сложная обработка, он может лучше отразитьapply
эффект.
В целом, для Серии,map
Он может решить большинство потребностей в обработке данных, но если вам нужно использовать более сложные функции, вам нужно использоватьapply
метод.
Обработка данных DataFrame
apply
правильноDataFrame
С точки зрения,apply
Это очень важный метод обработки данных. Он может принимать различные функции (встроенные или пользовательские в Python), и метод обработки очень гибкий. Давайте рассмотрим несколько примеров ниже.apply
Конкретное использование и принцип .
Прежде чем углубляться в детали, нам нужно сначала представитьDataFrame
серединаaxis
концепция, вDataFrame
В большинстве методов объекта будетaxis
Этот параметр определяет, выполняется ли указанная вами операция по оси 0 или по оси 1.axis=0
представляет пару действий列columns
провести,axis=1
представляет пару действий行row
действовать, как показано на рисунке ниже.
Если вы мало что знаете об этом, ничего страшного, мы поговорим об этом отдельно ниже.apply
Объясните операцию по оси 0 и оси 1 и продолжайте движение вниз.
Допустим, теперь необходимоdata
Числовые столбцы влогарифмироватьисуммаоперация, вы можете использоватьapply
Выполните соответствующую операцию, потому что она должна работать со столбцом, поэтому вам нужно указатьaxis=0
, наша проблема может быть легко решена с помощью следующих двух строк кода.
# 沿着0轴求和
data[["height","weight","age"]].apply(np.sum, axis=0)
# 沿着0轴取对数
data[["height","weight","age"]].apply(np.log, axis=0)
Способ его реализации прост, но вызовapply
Что именно произошло? Как осуществляется процесс? Или выяснить в качестве иллюстрации. (Возьмите первые пять частей данных в качестве примера)
когда вместе轴0(axis=0)
При работе каждый столбец (columns
) по умолчаниюSeries
Форма передается в качестве параметра в указанную вами функцию операции, операция объединяется и возвращается соответствующий результат.
Затем, если вам нужно работать по строке в реальном использовании (axis=1
), Как достигается весь процесс?
В наборе данных есть данные роста и веса, поэтому по этому мы можем рассчитать индекс ИМТ каждого человека (показатель, обычно используемый при медицинских осмотрах, важный стандарт измерения степени ожирения и здоровья организма человека) , формула расчета:体重指数BMI=体重/身高的平方(国际单位kg/㎡)
, так как операцию нужно выполнять над каждым образцом, здесь мы используемaxis=1
изapply
Для работы код такой:
def BMI(series):
weight = series["weight"]
height = series["height"]/100
BMI = weight/height**2
return BMI
data["BMI"] = data.apply(BMI,axis=1)
Давайте воспользуемся графическим способом, чтобы увидеть, как этот процесс реализован (в качестве примера взяты первые 5 фрагментов данных).
когдаapply
уже настроенaxis=1
При работе со строками каждая строка данных будетSeries
Форма (индекс Серии — это имя столбца) передается указанной функции и возвращается соответствующий результат.
суммировать доDataFrame
изapply
работать:
- когда
axis=0
когда, да每列columns
выполнить указанную функцию; когдаaxis=1
когда, да每行row
Выполнить указанную функцию. - несмотря ни на что
axis=0
все ещеaxis=1
, форма по умолчанию, переданная в указанную функцию,Series
, можно установитьraw=True
входящийnumpy数组
. - После выполнения результатов для каждой серии результат интегрируется вместе (если вы хотите вернуть, вам нужно определить функцию
return
соответствующее значение) - Конечно,
DataFrame
изapply
иSeries
изapply
Таким же образом он может получать и более сложные функции, такие как входящие параметры и т. д. Принцип реализации тот же, за подробностями обращайтесь к официальной документации.
applymap
applymap
Использование относительно простое, будетDataFrame
Каждая ячейка в выполняет действие указанной функции, хотя и менее полезной.apply
Обширный, но полезный в некоторых ситуациях, как в примере ниже.
Для удобства демонстрации вновь сгенерированныйDataFrame
df = pd.DataFrame(
{
"A":np.random.randn(5),
"B":np.random.randn(5),
"C":np.random.randn(5),
"D":np.random.randn(5),
"E":np.random.randn(5),
}
)
df
теперь хочуDataFrame
Все значения отображаются с двумя десятичными знаками, используйтеapplymap
Вы можете быстро добиться желаемого, код и схема следующие:
df.applymap(lambda x:"%.2f" % x)
Здесь представлены три оси обработки данных.Если у вас есть какие-либо вопросы, оставьте сообщение ниже!
Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерейные товары в первый раз, и вы также можете присоединиться к группе обмена обучением Python! !