Python_pandas不是熊猫(3)——Series自定义运算Series.apply()

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.
'''

S e r i e s ( ) 给Series的值上调用函数(不太好翻译哈)
传入的函数可以是:

  • S e r i e s n u m p y 适用于整个Series的numpy函数
  • 适用于单个值的普通函数

先不往下看,咱们举个例子:

>>> 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操作

原创文章 66 获赞 14 访问量 9092

猜你喜欢

转载自blog.csdn.net/HaoZiHuang/article/details/105181270