Pandas用到今天,没成想竟忽略了这个函数

简介: Pandas素以API丰富著称,个人也是常常沉醉于其中的各种骚操作而不能自拔(好吧,有些言重了)。近日,发现了一个前期一直忽略了的函数,仔细探索之下,发现竟然还有一些好用的功能,这个函数就是——transform。

640.png

transform是Pandas中的一个函数,既可组用于Series和DataFrame,也可与groupby联用作用于DataFrameGroupBy对象,所以本文主要介绍transform的两个主要功能:

  • 元素级的函数变换
  • 与groupby配套统计(维度无reduce,可参考窗口函数)


01 transform介绍


首先来看下transform的官方文档介绍:


def transform(
    obj: FrameOrSeries, func: AggFuncType, axis: Axis, *args, **kwargs
) -> FrameOrSeriesUnion:
    """
    Transform a DataFrame or Series
    Parameters
    ----------
    obj : DataFrame or Series
        Object to compute the transform on.
    func : string, function, list, or dictionary
        Function(s) to compute the transform with.
    axis : {0 or 'index', 1 or 'columns'}
        Axis along which the function is applied:
        * 0 or 'index': apply function to each column.
        * 1 or 'columns': apply function to each row.
    Returns
    -------
    DataFrame or Series
        Result of applying ``func`` along the given axis of the
        Series or DataFrame.


从函数签名可以看出,transform主要包括2个指定参数func和axis,其中func即为接收的处理函数,可以是函数对象、函数名字符串、函数列表以及字典函数等;axis即为作用的轴向;另有*args和**kwargs用于接收func函数的可变长参数及字典参数。


02 元素级的函数变换


在前期推文Pandas中的这3个函数,没想到竟成了我数据处理的主力一文中,重点介绍了apply、map以及applymap共3个函数的常用用法,那么transform的第一个功能颇有些map+applymap的味道:其中,map是只能用于Series对象的元素级变换,applymap则是只能用于DataFrame对象的元素级变换,但却要求必须所有函数都只能做相同函数处理,这又多少有些受限。


所以,transform呢?就既能满足map和applymap的部分需求,又在其基础上提供了更为丰富的操作。比如给定如下一个DataFrame:


640.png


需要对数值列A执行指数和对数两种运算(即对一个Series对象用transform,得到一个两列的DataFrame),显然传递函数格式需用列表,即:


640.png


进一步地,不仅需要对A列执行指数和对数计算,还需对字符串列B执行求长度计算,那么此时需要用transform的字典格式传递函数


640.png


上述例子中未声明axis参数,此时默认axis=0,即传递的函数是按列起作用。下面我们再举个例子,尝试一下axis=1的效果:


640.png


在这个例子中,通过传入axis=1这一参数,实现了对不同行调用不同函数的处理效果,且这里的函数包括传递字符串形式、函数对象以及lambda表达式等3种形式。


以上,其实transform实现的又何尝不是map或者applymap的效果呢?但又远比二者功能更具定制化。


03 与groupby配套使用


transform可用于groupby对象,这是我最初学习transform的作用,在Pandas中groupby的这些用法你都知道吗?一文中其实也有所介绍,所以此处就简单提及。


Pandas实现常用的聚合统计中,一般是用groupby直接加聚合函数或者通过agg传递若干聚合函数,更为定制化的也可通过groupby+apply实现。然而,这三种实现其实都有一个共同特点:那就是groupby之后行数一般会发生reduce(体现为行数减少),这也是通常意义下"聚合"的含义。那么某些场景下,其实是不需要聚合的,例如给定如下数据样例:


640.png


需要统计每个id各门课成绩的占比,如果用常规的聚合统计的思路需要用3步实现:

  • df.groupby("id").sum("score"),得到每个id的成绩总和
  • df与上述结果按照id进行merge,得到关联后的score和总成绩
  • score列与总成绩相除,得到占比


640.png


同样需求,如果巧妙使用transform的话那么就可以一步到位:


640.png


这个实现起来就很爽了,对吧


640.png




目录
相关文章
|
3月前
|
存储 数据挖掘 数据处理
Pandas中explode()函数的应用与实战
Pandas中explode()函数的应用与实战
56 0
|
3月前
|
数据挖掘 数据处理 索引
python常用pandas函数nlargest / nsmallest及其手动实现
python常用pandas函数nlargest / nsmallest及其手动实现
94 0
|
3月前
|
人工智能 数据处理 计算机视觉
Pandas数据处理——渐进式学习、DataFrame(函数检索-请使用Ctrl+F搜索)
Pandas数据处理——渐进式学习、DataFrame(函数检索-请使用Ctrl+F搜索)
119 0
|
3月前
|
数据处理 索引 Python
使用pandas的merge()和join()函数进行数据处理
使用pandas的merge()和join()函数进行数据处理
71 2
|
3月前
|
机器学习/深度学习 存储 算法
Pandas中的get_dummies()函数实战应用详解
Pandas中的get_dummies()函数实战应用详解
78 1
|
3月前
|
人工智能 数据挖掘 Python
Python pandas中read_csv函数的io参数
Python pandas中read_csv函数的io参数
51 5
|
3月前
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
【5月更文挑战第2天】在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
173 0
|
3月前
|
数据处理 数据格式 Python
python进行数据处理——pandas的drop函数
python进行数据处理——pandas的drop函数
|
3月前
|
Python
在Python中,pandas库的`get_dummies`函数
在Python中,pandas库的`get_dummies`函数
370 2
|
3月前
|
人工智能 程序员 数据处理
Pandas数据处理3、DataFrame去重函数drop_duplicates()详解
Pandas数据处理3、DataFrame去重函数drop_duplicates()详解
120 0
Pandas数据处理3、DataFrame去重函数drop_duplicates()详解