不管是为Pandas对象应用自定义函数,还是应用第三方函数,都离不开以下几种方法。用哪种方法取决于操作的对象是DataFrame,还是Series;是行、列,还是元素。
1.表现级函数应用:pipe()
2.行列级函数应用:apply()
3.聚合API:agg()与transform()
4.元素级函数应用:applymap()
表现级函数应用
虽然可以把DataFrame与Series传递给函数,不过链式调用函数时,最好使用pipe()方法。对比以下两种方式:
下列代码与上述代码是等效的:
Pandas建议使用第二种方式,即链式方法。在链式方法中调用自定义函数或第三方支持库函数时,用pipe更容易,与用Pandas自身方法一样。
上述示例中,f、g与h这几个函数都把DataFrame当作首位参数。要是想把数据作为第二个参数,我们可以怎么做呢?本例中,pipe为元组(callable,data_keyword)形式。.pipe把DataFrame作为元组里指定的参数。
下面示例用statmodels拟合回归,该API先接收一个公示,DataFrame是第二个参数,data。要传递函数,则要用pipe接收关键词对(sm.ols,’data’)。
unix的pipe与后来出现的dplyr及magrittr带动了pipe方法,在此,引入了R语言里用于读取pipe的操作符(%>%)。pipe的实现思路非常清晰,仿佛跟Python源生的一样。
行列级函数应用
apply()方法沿着DataFrame的轴应用函数,比如,描述性统计方法,该方法支持axis参数。
apply()方法还支持通过函数名字符串调用函数。
默认情况下,apply()调用的函数返回的类型会影响DataFrame输出结构的类型。
函数返回的是Series时,最终输出结果是DataFrame。输出的列与函数返回的Series索引相匹配。
函数返回其它任意类型时,输出结果是Series。
result_type会覆盖默认行为,该参数有三个选项:reduce、broadcast、expand。
这些选项决定了列表型返回值是否扩展为DataFrame。
我们用好了apply()的话,可以了解数据集的很多信息。比如可以提取每列的最大值对应的日期:
还可以向apply()方法传递额外的参数与关键字参数。比如下面示例中要应用的这个函数:
可以用以下方式应用该函数:
为每行或每例执行Series方法的功能也非常的实用:
apply()有一个参数raw,默认值为False,再应用函数前,使用该参数可以将每行或列转换为Series。该参数为True时,传递的函数接收ndarray对象,若不需要索引功能,这样操作能够显著的提高性能。
聚合API
聚合API可以快速、简洁地执行多个聚合操作。Pandas对象支持多个类似地API,如groupby
API、window functions API、resample
API。聚合函数为DataFrame.aggregate(),也可以叫做Dataframe.agg()。
在这里我们用与上例类似的DataFrame:
应用单个函数时,该操作与apply()等效,这里也可以用字符串表示聚合函数名。下面的聚合函数输出的结果为Series:
Series单个聚合操作返回标量值:
多聚合函数
还可以用列表形式传递多个聚合函数。每个函数在输出结果DataFrame里以行的形式显示,行名是每个聚合函数的函数名。
多个函数输出多行:
Series聚合多函数返回结果还是Series,索引为函数名:
传递lambda函数时,输出名为
应用自定义函数时,该函数名为输出结果的行名:
用字典实现聚合
指定为哪些列应用哪些聚合函数时,需要把包含列名与标量(或标量列表)的字典传递给DataFrame.agg。
但我们要注意,这里输出结果的顺序不是固定的,要想让输出顺序与输入顺序一致,我们可以使用OrderedDict。
输出的参数是列表时,输出的结果为DataFrame,并以矩阵形式显示所有聚合函数的计算结果,且输出结果有所有唯一函数组成。未执行聚合操作的列输出结果为NaN值:
多种数据类型(Dtype)
与groupby的.agg操作类似,DataFrame含不能执行聚合的数据类型时,.agg只计算可聚合的列:
自定义Describe
.agg()可以创建类似于内置describe函数的自定义describe函数。
Transfrom API
transform方法的返回结果与原始数据的索引相同,大小相同。与.agg API类似,该API支持同时处理多种操作,不用一个一个操作。
首先,创建一个DataFrame:
这里转换的是整个DataFrame。.transform()支持NumPy函数、字符串函数及自定义函数。
这里的transform()接收单个函数;与ufunc等效。
.transform向Series传递单个函数时,返回的结果也是单个Series。
多函数Transfrom
transform()调用多个函数时,生成多层索引DataFrame。第一层是原始数据集的列名;第二层是transform()调用的函数名。
为Series应用多个函数时,输出结果是DataFrame,列名是transform()调用的函数名。
用字典执行transfrom操作
函数字典可以为每列执行指定transform()操作。
transform()的参数是列表字典时,生成的是以transform()调用的函数名为多层索引的DataFrame。
元素级函数应用
并非所有函数都能矢量化,即接受NumPy数组,返回另一个数组或值,DataFrame的applymap()及Series的map(),支持任何接收单个值并返回单个值的Python函数。
Series.map()还有个功能,可以“连接”或“映射”第二个Series定义的值。这与merging/joining功能联系非常紧密:
以上就是Pandas函数应用的所有知识了,希望对你有所帮助。
如果你想学习Python,但是找不到学习路径和资源,欢迎来指尖编程。
高效在线交互式学Python,更快更好!