Pandas函数应用

341 阅读5分钟

不管是为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,更快更好!