这是一篇最基础的Pandas用法总结,也方便自己日后进行复习与查询。
这一次我们来总结一下Pandas中的map类函数。
Python中自带的map()函数
先从Python中自带的map()函数说起。简单来说,map函数的作用是,针对一个列表(实际上为一个或多个可迭代的序列,这里以一个列表为例),将一个函数作用在列表上的每一个元素。
以经典的计算数的平方为例:
def square(x):
return x**2
# 第一个参数传入自定义的函数名,第二个参数传入列表
# python3.x中map返回的是迭代器,可以用list()转换为列表输出
list(map(square, [2, 3, 5]))
[out]:
[4, 9, 25]
除了传入自定义的函数名之外,还可以传入lambda匿名函数。
- lambda匿名函数只提供一个参数时
list(map(lambda x: x**2, [2, 3, 5]))
[out]:
[4, 9, 25]
- lambda匿名函数提供两个参数时
# x、y中每个元素分别相加
list(map(lambda x, y: x + y, [1, 5, 6], [2, 4, 5]))
[out]:
[3, 9, 11]
- 当map的第二个参数为字典时,map只对字典中的key起作用
list(map(lambda x: x**2, {1:7, 2:5})) # 对每一个key平方
[out]:
[1, 4]
Pandas中的map()函数
pandas中的map()函数是针对Series来说的,是将一个函数作用在Series中的每一个元素上。
df = pd.DataFrame([['F',90, 88, 85],
['M', 75, 97, 74],
['F', 82, 73, 91],
['M', 93, 99, 96]],
columns=['gender','chinese', 'math', 'english'],
index = ['小红', '小亮', '小兰', '小明'])
print(df)
[out]:
gender chinese math english
小红 F 90 88 85
小亮 M 75 97 74
小兰 F 82 73 91
小明 M 93 99 96
在map()中传入一个函数
# 每人语文成绩加5分
# 此时匿名函数中的x指代的是Series中的一个元素
df['chinese'] = df['chinese'].map(lambda x: x +5)
df
[out]:
gender chinese math english
小红 F 95 88 85
小亮 M 80 97 74
小兰 F 87 73 91
小明 M 98 99 96
在map()中也可以传入一个字典:
# 将性别一列,F映射成0, M映射成1
d = {'F':0, 'M':1}
df['gender'] = df['gender'].map(d)
df
[out]:
gender chinese math english
小红 0 95 88 85
小亮 1 80 97 74
小兰 0 87 73 91
小明 1 98 99 96
Pandas中的applymap()函数
Pandas中的applymap()函数是针对DataFrame来说的,是将一个函数作用在DataFrame中的每一个元素上。
# 将df中的每一个元素都转成字符串,并在末尾添加A
# 此时匿名函数中的x指代的是DataFrame中的一个元素
df2 = df.applymap(lambda x: str(x) + 'A')
df2
[out]:
gender chinese math english
小红 0A 95A 88A 85A
小亮 1A 80A 97A 74A
小兰 0A 87A 73A 91A
小明 1A 98A 99A 96A
Pandas中的apply()函数
Pandas中的apply()函数也是针对DataFrame来说的,但是这次是将一个函数作用在DataFrame中的一整列或一整行上。
其中,参数axis=1是将函数作用在一整行,axis=0(为默认值)作用在一整列。
# 增加一列total,值为语数外三科之和
# 此时匿名函数中的x指代的是一整行
df['total'] = df[['chinese', 'math', 'english']].apply(lambda x: x.sum(), axis = 1)
df
[out]:
gender chinese math english total
小红 0 95 88 85 268
小亮 1 80 97 74 251
小兰 0 87 73 91 251
小明 1 98 99 96 293
# 增加一行,计算每一列的平均值
# 此时匿名函数中的x指代的是一整列
df.loc['平均'] = df.apply(lambda x: x.mean(), axis=0)