今天我们分享一个非常常用且重要的pandas数据映射函数apply。
我们在数据分析过程中,通常需要对原始的数据进行很多转换和处理,比如对于出生日期,我们希望获得年龄的特征;对于身高和体重的数据,我们希望或者BMI指数等等。
这种操作在分析过程是最常用的数据处理,这个过程涉及对一列或者多列数据进行操作。pandas中用apply函数来处理这个过程。
apply函数的作用:就是用某个指定的函数f来依次作用于DataFrame或者Series的每个数据,可以指定按行处理和按列处理。
我们看一个例子:
import pandas as pd
import numpy as np
data_df = pd.DataFrame({'name': ['jack', 'lili', 'abc'],
'birthday': ['2001-01-01', '2003-12-01', '2005-09-01'],
'height':[1.2, 1.5, 1.6],
'weight': [40, 50, 30]})
data_df['age'] = data_df['birthday'].apply(lambda x: (datetime.now().timestamp()-datetime.strptime(x, '%Y-%m-%d').timestamp())//86400/365)
data_df['age'] = data_df['age'].astype(int)
如果是计算逻辑比价简单的,处理逻辑可以通过lambda函数进行处理;比如上面的例子中通过出生日期计算年龄。默认情况下apply传入函数的参数为series(按列),映射函数对每一列的每一行数据执行函数操作。
也可以定义一个函数来代替lambda,如下cal_age代替:
def cal_age(x):
age_ts = datetime.now().timestamp() - datetime.strptime(x, '%Y-%m-%d').timestamp()
return age_ts // 86400 / 365
data_df['age'] = data_df['birthday'].apply(cal_age).astype(int)
如果数据处理需要多个数据,比如计算BMI指数需要升高和体重。
def bmi(x):
return x['weight'] / x['height'] ** 2
data_df['bmi'] = data_df[['height', 'weight']].apply(bmi, axis=1)
从上可知,计算多列数据时,apply传入映射函数的参数为Series,通过axis指定按行还是按列,axis=1为按行,即每一行的多个列的值传入映射行数。以bmi例子,传入的是每个人的身高和体重参数。
apply函数就分享到这,希望对你有帮助。