Pandas 的 apply() 方法是用来调用一个函数(Python method),让此函数对数据对象进行批量处理。Pandas 的很多对象都可以apply()使用来调用函数,如 Dataframe、Series、分组对象、各种时间序列等。

语法结构

apply函数是`pandas`里面所有函数中自由度最高的函数。使用时,通常放入一个lambda函数表达式、或一个函数作为操作运算,官方上给出DataFrame的apply()用法:

代码语言:javascript

代码运行次数:0

运行

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwargs)
参数:

func: 函数或 lambda 表达式,应用于每行或者每列

axis: {0 or "index", 1 or "columns"}, 默认为0
0 or "index": 表示函数处理的是每一列
1 or "columns": 表示函数处理的是每一行

raw: bool 类型,默认为 False;
False,表示把每一行或列作为 Series 传入函数中;
True,表示接受的是 ndarray 数据类型;

result_type: {"expand", "reduce", "broadcast", None}, default None
These only act when axis=1 (columns):
"expand": 列表式的结果将被转化为列。
"reduce": 如果可能的话,返回一个 Series,而不是展开类似列表的结果。这与 expand 相反。
"broadcast": 结果将被广播到 DataFrame 的原始形状,原始索引和列将被保留。

args: func 的位置参数

**kwargs: 要作为关键字参数传递给 func 的其他关键字参数,1.3.0 开始支持

返回值:

Series 或者 DataFrame:沿数据的给定轴应用 func 的结果

apply函数

apply函数是`pandas`里面所有函数中自由度最高的函数。该函数如下:

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

该函数最有用的是第一个参数,这个参数是函数,相当于C/C++的函数指针。

这个函数需要自己实现,函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个Series数据结构并返回。

比如读取一个表格:

假如我们想要得到表格中的PublishedTimeReceivedTime属性之间的时间差数据,就可以使用下面的函数来实现:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

import pandas as pd
import datetime   #用来计算日期差的包

def dataInterval(data1,data2):
    d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
    d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
    delta = d1 - d2
    return delta.days

def getInterval(arrLike):  #用来计算日期间隔天数的调用的函数
    PublishedTime = arrLike['PublishedTime']
    ReceivedTime = arrLike['ReceivedTime']
# print(PublishedTime.strip(),ReceivedTime.strip())
    days = dataInterval(PublishedTime.strip(),ReceivedTime.strip())  #注意去掉两端空白
    return days

if __name__ == '__main__':    
    fileName = "NS_new.xls";
    df = pd.read_excel(fileName) 
    df['TimeInterval'] = df.apply(getInterval , axis = 1)

有时候,我们想给自己实现的函数传递参数,就可以用的apply函数的*args**kwds参数,比如同样的时间差函数,我希望自己传递时间差的标签,这样每次标签更改就不用修改自己实现的函数了,实现代码如下:

代码语言:javascript

代码运行次数:0

运行

AI代码解释

import pandas as pd
import datetime   #用来计算日期差的包

def dataInterval(data1,data2):
    d1 = datetime.datetime.strptime(data1, '%Y-%m-%d')
    d2 = datetime.datetime.strptime(data2, '%Y-%m-%d')
    delta = d1 - d2
    return delta.days

def getInterval_new(arrLike,before,after):  #用来计算日期间隔天数的调用的函数
    before = arrLike[before]
    after = arrLike[after]
# print(PublishedTime.strip(),ReceivedTime.strip())
    days = dataInterval(after.strip(),before.strip())  #注意去掉两端空白
    return days


if __name__ == '__main__':    
    fileName = "NS_new.xls";
    df = pd.read_excel(fileName) 
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, args = ('ReceivedTime','PublishedTime'))    #调用方式一
    #下面的调用方式等价于上面的调用方式
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, **{ 
   'before':'ReceivedTime','after':'PublishedTime'})  #调用方式二
    #下面的调用方式等价于上面的调用方式
    df['TimeInterval'] = df.apply(getInterval_new , 
      axis = 1, before='ReceivedTime',after='PublishedTime')  #调用方式三

修改后的getInterval_new函数多了两个参数,这样我们在使用apply函数的时候要自己传递参数,代码中显示的三种传递方式都行。

最后,本篇的全部代码在下面这个网页可以下载:

https://github.com/Dongzhixiao/Python_Exercise/tree/master/pandas_apply

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐