0.写在前面
之前大意疏忽了,补上pandas
的版本:
>>> import pandas as pd;pd.__version__
'1.0.3'
准备我们要用的数据:
import pandas as pd
import numpy as np
rst = np.random.RandomState(seed=2333) # 加入seed,使得生成的数据相同
example_array = rst.uniform(size=(5,5))
index = ['张飞', '关羽', '赵云', '黄忠', '马超']
columns= ['血量', '智力', '敏捷', '攻击', '防御']
example_df = pd.DataFrame(example_array, columns=columns, index=index)
1.Series.apply概况
我们先来看看Series.apply
:
Series.apply(func, convert_dtype=True, args=(), **kwds)
'''
官方介绍:
Invoke function on values of Series.
Can be ufunc (a NumPy function that applies to the entire Series)
or a Python function that only works on single values.
'''
先不往下看,咱们举个例子:
>>> ser = example_df['血量']
>>> ser
张飞 0.529778
关羽 0.387585
赵云 0.393336
黄忠 0.763137
马超 0.468712
Name: 血量, dtype: float64
>>> # 例:适用于整个Series的numpy函数 (实际上也可适用于单个值)
>>> ser.apply(np.log)
张飞 -0.635298
关羽 -0.947821
赵云 -0.933091
黄忠 -0.270318
马超 -0.757766
Name: 血量, dtype: float64
>>>
>>> # 例:适用于单个值的普通函数
>>> ser.apply(lambda x: x+1)
张飞 1.529778
关羽 1.387585
赵云 1.393336
黄忠 1.763137
马超 1.468712
Name: 血量, dtype: float64
2.Series.apply传入位置参数
如果,我们传入的函数,需要别的参数肿么办?
那我们就用到了经典参数args=(), **kwds
我们看一例子:
# 此处我们模拟一个受伤扣血的函数
def getInjured(x, y):
'''
x是指,当前将领的血量
y是指,受伤扣除的血量
'''
return x - y
>>> ser = example_df['血量']
>>> ser
张飞 0.529778
关羽 0.387585
赵云 0.393336
黄忠 0.763137
马超 0.468712
Name: 血量, dtype: float64
>>>
>>> # 此时将领收到袭击,每个人血量减 0.01,此时要用 args 参数
>>> ser.apply(getInjured, args=(0.01,))
张飞 0.519778
关羽 0.377585
赵云 0.383336
黄忠 0.753137
马超 0.458712
Name: 血量, dtype: float64
>>> # 每个人血量减 0.01
注:
- 给
args
传参数是以元组的形式,若为单元素元组,则应加逗号,即:(x,)
args
传入的参数为位置参数
3.Series.apply传入关键字参数
我们再看一个传入关键字参数的例子:
# 此处我们模拟一个补血的函数
# 给武将对应的食物,武将能恢复对应的血量
def recover(x, **kwargs):
'''
x是当前武将的血量
kwargs 是要传入的关键字参数
'''
# 我们建立一个食物与血量的对应关系表
# 吃对应的食物,恢复对应的血量
food_map = {'milk':0.01,
'beef':0.2,
'apple':0.01}
# 吃对应的食物,添加对应的血量
if 'milk' in kwargs.keys():
x += kwargs['milk'] * food_map['milk']
if 'beef' in kwargs.keys():
x += kwargs['beef'] * food_map['beef']
if 'apple' in kwargs.keys():
x += kwargs['apple'] * food_map['apple']
return x
>>> ser = example_df['血量'];ser
张飞 0.529778
关羽 0.387585
赵云 0.393336
黄忠 0.763137
马超 0.468712
Name: 血量, dtype: float64
>>> ser.apply(recover, milk=2, apple=0) # 喝了两杯牛奶,吃了0个苹果
张飞 0.549778
关羽 0.407585
赵云 0.413336
黄忠 0.783137
马超 0.488712
Name: 血量, dtype: float64
4.Series.apply的convert_dtype
只剩下最后一个参数convert_dtype
:
convert_dtype : bool, default True
Try to find better dtype for elementwise function results. If
False, leave as dtype=object.
`convert_dtype` 参数接收布尔值,默认为 True,意思是,尝试以更好的数据类型表达返回值
若为 False,则返回值的 `dtype=object`
下一篇博客我们来说说,DataFrame.apply
操作