Python数据分析和数据处理库Pandas(apply函数)
·
目录
1.可以通过np.vectorize()将函数向量化来进行计算
apply()函数可以对DataFrame或Series的数据进行逐行、逐列或逐元素的操作。可以使用自定义函数对数据进行变换、计算或处理,通常用于处理复杂的变换逻辑,或者处理不能通过向量化操作轻松完成的任务。所谓向量化操作就是axis=0或axis=1的那一套。
一.Series使用apply()
import pandas as pd
# Series的apply方法调用的函数,参数接收的是Series中的一个元素
def func(item):
return item * 20
s = pd.Series([10, 20, 30])
print(s.apply(func))
运行结果:

也可以传入lambda表达式。
print(s.apply(lambda item : item * 20))
传入带参数的函数。
import pandas as pd
# apply()方法会将自己没有匹配上的参数(p1=3),
# 在调用func的时候作为func的参数传递过去,必须通过关键字传参,
# 有点类似C++的bind()
def func(item, p1):
return item * p1
s = pd.Series([10, 20, 30])
print(s.apply(func, p1=3))
二.DataFrame使用apply()
import pandas as pd
# DataFrame的apply方法调用的函数,参数接收的是 DataFrame 中的一个Series
def func(s):
return s.sum()
df = pd.DataFrame({"a": [10, 20, 30], "b": [40, 50, 60]})
print(df.apply(func))
运行结果:

import pandas as pd
# DataFrame的apply方法调用的函数,参数接收的是DataFrame中的一个Series
def func(s):
return s.sum()
df = pd.DataFrame({"a": [10, 20, 30], "b": [40, 50, 60]})
# 默认axis=0,按行方向进行操作,对列进行统计;
# 可以设置axis=1,按照列的方向进行操作,对行进行统计
print(df.apply(func, axis=1))
运行结果:

注意:df.apply 一次只能处理一个 Series(当 axis=0 时处理列,当 axis=1 时处理行),但如下的函数 func中,获取同一个Series对象的两列数据a和b,所以不能直接使用 df.apply(f)按列处理了,需要指定axis=1,按行处理,才能获取一行中的不同列。
import pandas as pd
def func(s):
return s["a"] / s["b"]
df = pd.DataFrame({"a": [10, 20, 30], "b": [40, 50, 60]})
print(df.apply(func, axis=1))
运行结果:

三.向量化函数
- 标量(Scalar):就是单个数字,比如
0、10、3.14,它只有一个值。 - 向量(Vector):就是一串数字组成的序列,比如
[10, 20, 30]或[40, 0, 60],它是一组有次序的值。
import pandas as pd
import numpy as np
def f(x, y):
if y == 0:
return np.nan
return x / y
df = pd.DataFrame({"a": [10, 20, 30], "b": [40, 0, 60]})
print(f(df["a"], df["b"])) # ValueError
上述代码会报错,理由如下:
y是向量[40, 0, 60],执行if y == 0:时,会得到一个布尔向量[False, True, False]。if语句无法判断一个布尔向量的整体真假(是True还是False),所以会抛出ValueError。
1.可以通过np.vectorize()将函数向量化来进行计算
import pandas as pd
import numpy as np
def f(x, y):
if y == 0:
return np.nan
return x / y
df = pd.DataFrame({"a": [10, 20, 30], "b": [40, 0, 60]})
f_vec = np.vectorize(f)
print(f_vec(df["a"], df["b"]))
运行结果:
![]()
2.也可以使用@np.vectorize装饰器将函数向量化
import pandas as pd
import numpy as np
@np.vectorize
def f(x, y):
if y == 0:
return np.nan
return x / y
df = pd.DataFrame({"a": [10, 20, 30], "b": [40, 0, 60]})
print(f(df["a"], df["b"]))
运行结果同上:
![]()
更多推荐



所有评论(0)