Map, apply, applymap详解
import numpy as np
import pandas as pd
boolean = [True, False]
gender = ['男', '女']
color = ['white', 'black', 'red', 'green']
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)]
}
)
# print(data.head(10))
# method one: use dict to map
data['gender'] = data['gender'].map({"男":1,"女":0})
# method two: use function to map
# def gender_map(x):
# if x== "男":
# return 1
# else :
# return 0
# data['gender'] = data['gender'].map(gender_map)
#this show the power of apply function
def age_apply(age,gap):
return age + gap
data['age'] = data['age'].apply(age_apply,args=(-3,))
# print(data.head(10))
data_raw = data[['height','weight','age']]
print(data_raw.head(10))
# show the difference between axis = 0 and axis = 1
# print(data_raw.apply(np.sum,axis=1).head(10))
# print(data_raw.apply(np.sum,axis=0).head(10))
# show the applymap function
print(data_raw.head(10))
print(data_raw.applymap(lambda x: x%10).head(10))
Series 数据处理
series指的是单列数据的处理
- map用法
map函数的功能是根据字典或者函数,将series数据中的内容转换为另外一个数值。
当使用字典匹配的时候,原数值必须是字典的键,字典中该键对应的值为需要转换的值;当使用函数匹配的时候,原数值是函数的输入值,函数结果是需要转换的值。
原数据:
处理后数据:
希望通过数据处理将gender列中所有的男转变为1,女转变为0.这里可以通过map的两种方式来达到这个目的。
通过字典来匹配:
通过函数来匹配:
map中传入的函数,只能有一个输入参数,否则将报错。
不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入字典或函数中,得到映射后的值。
- apply用法
apply方法的作用原理和map方法类似,区别在于apply能够传入功能更为复杂的函数。
比如说apply函数可以输入多个参数,而map中函数只能输入一个参数。
这里举的例子中是这样的,由于记录原因需要将每个人的年龄统一增加或者减少一个数值。
源数据:
处理后数据:
当使用apply来处理series数据时,apply中只需输入函数名称及相应的输入参数。
由于在使用apply函数的时候,默认应用的函数输入参数中录入了各行需要处理的数据作为输入参数,所以只需要输入其它参数即可,但是需要在参数尾部以逗号结束,以表示系统自动添加被处理数据作为输入参数。
绝大多数的serial数据都可以通过map函数来处理,当遇到更复杂的数据处理的时候可以通过apply函数来处理。
DataFrame数据处理
- apply用法
DataFrame数据指的是数据表的操作,针对与表的操作存在两个维度即以行为单位操作还是以列为单位操作,这个区分是通过axis参数来区分的。axis=0表示以列为单位进行操作,axis=1表示以行为单位进行操作。
为了演示这个区别我们使用同一个函数,处理相同的数据,查看这两个参数不同时的区别。
原数据 | axis=1 | axis=0 |
|
| |
从中可以看出当axis=1时,sum函数以每一行为单位,结果为height+weight+age的和。
当axis=0时,sum函数以每一列为单位,结果为height整列的和与weight整列的和与age整列的和。
也就是说当我们希望对每条记录进行操作时,应该使用axis=1,当我们希望对每列汇总计算时,应该使用axis=0
- applymap用法
applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作,虽然用途不如apply广泛,但在某些场合下还是比较有用的。
原数据 | 处理后数据 |
| |