目录

一.Series使用apply()

二.DataFrame使用apply()

三.向量化函数

1.可以通过np.vectorize()将函数向量化来进行计算

2.也可以使用@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):就是单个数字,比如 0103.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"]))

        运行结果同上:

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐