分享Pandas库中的一些宝藏函数transform()

Pandas函数的核心功能是,既计算了统计值,又保留了明细数据。为了更好地理解transform和agg的不同,下面从实际的应用场景出发进行对比。

aggregation会返回数据的缩减版本,而transformation能返回完整数据的某一变换版本供我们重组。这样的transformation,输出的形状和输入一致。一个常见的例子是通过减去分组平均值来居中数据。

#数据构造
data = pd.DataFrame(
{"company":['百度', '阿里', '百度', '阿里', '百度', '腾讯', '腾讯', '阿里', '腾讯', '阿里'],
"salary":[43000, 24000, 40000, 39000, 8000, 47000, 25000, 16000, 21000, 38000],
"age":[25, 34, 49, 42, 28, 23, 45, 21, 34, 29]})
data
  company  salary  age
0      百度   43000   25
1      阿里   24000   34
2      百度   40000   49
3      阿里   39000   42
4      百度    8000   28
5      腾讯   47000   23
6      腾讯   25000   45
7      阿里   16000   21
8      腾讯   21000   34
9      阿里   38000   29

1、transform作用于Series

1)单个变换函数

当transform作用于单列Series时较为简单 ,对salary列进行transform变换我们可以传入任意的非聚合类函数,比如对工资列对数化

import pandas as pd
import numpy  as np
# 对工资对数化
data['salary'].transform(np.log)
0    10.668955
1    10.085809
2    10.596635
3    10.571317
4     8.987197
5    10.757903
6    10.126631
7     9.680344
8     9.952278
9    10.545341
Name: salary, dtype: float64

除了内置函数,还可以传入lambda函数

# lambda函数
data['salary'].transform(lambda s: s+1)
0    43001
1    24001
2    40001
3    39001
4     8001
5    47001
6    25001
7    16001
8    21001
9    38001
Name: salary, dtype: int64

2)多个变换函数

也可以传入包含多个变换函数的列表来一口气计算出多列结果:

data['salary'].transform([np.log, lambda s: s+1, np.sqrt])
   log  <lambda>        sqrt
0  10.668955     43001  207.364414
1  10.085809     24001  154.919334
2  10.596635     40001  200.000000
3  10.571317     39001  197.484177
4   8.987197      8001   89.442719
5  10.757903     47001  216.794834
6  10.126631     25001  158.113883
7   9.680344     16001  126.491106
8   9.952278     21001  144.913767
9  10.545341     38001  194.935887

而又因为transform传入的函数,在执行运算时接收的输入参数是对应的整列数据,所以我们可以利用这个特点实现诸如数据标准化、归一化等需要依赖样本整体统计特征的变换过程:

# 利用transform进行数据标准化
data['salary'].transform(lambda s: (s - s.mean()) / s.std())
0    0.991038
1   -0.468630
2    0.760564
3    0.683739
4   -1.697825
5    1.298337
6   -0.391806
7   -1.083228
8   -0.699104
9    0.606915
Name: salary, dtype: float64

2、 transform作用于DataFrame

当transform作用于整个DataFrame时,实际上就是将传入的所有变换函数作用到每一列中:

data.loc[:,'salary':'age'].transform(lambda s:(s-s.mean()) /s.std())
     salary       age
0  0.991038 -0.832050
1 -0.468630  0.104006
2  0.760564  1.664101
3  0.683739  0.936057
4 -1.697825 -0.520031
5  1.298337 -1.040063
6 -0.391806  1.248075
7 -1.083228 -1.248075
8 -0.699104  0.104006
9  0.606915 -0.416025

而当传入多个变换函数时,对应的返回结果格式类似agg中的机制,会生成MultiIndex格式的字段名

data.loc[:, 'salary': 'age'].transform([np.log, lambda s: s+1])
  salary                age
         log <lambda>       log <lambda>
0  10.668955    43001  3.218876       26
1  10.085809    24001  3.526361       35
2  10.596635    40001  3.891820       50
3  10.571317    39001  3.737670       43
4   8.987197     8001  3.332205       29
5  10.757903    47001  3.135494       24
6  10.126631    25001  3.806662       46
7   9.680344    16001  3.044522       22
8   9.952278    21001  3.526361       35
9  10.545341    38001  3.367296       30

而且由于作用的是DataFrame,还可以利用字典以键值对的形式,一口气为每一列配置单个或多个变换函数:

(data.loc[:, 'salary': 'age']
.transform({'age': lambda s: (s - s.mean()) / s.std(),
                'salary': [np.log, np.sqrt]}))
   age     salary
   <lambda>        log        sqrt
0 -0.832050  10.668955  207.364414
1  0.104006  10.085809  154.919334
2  1.664101  10.596635  200.000000
3  0.936057  10.571317  197.484177
4 -0.520031   8.987197   89.442719
5 -1.040063  10.757903  216.794834
6  1.248075  10.126631  158.113883
7 -1.248075   9.680344  126.491106
8  0.104006   9.952278  144.913767
9 -0.416025  10.545341  194.935887

3、transform作用于groupby分组后

在原来的数据中,我们知道了如何求不同公司的平均薪水,假如需要在原数据集中新增一列salary_mean,代表该公司的平均薪水,该怎么实现呢?

data['salary_mean'] = data.groupby('company')[['salary']].transform('mean')
data
  company  salary  age   salary_mean
0      百度   43000   25  30333.333333
1      阿里   24000   34  29250.000000
2      百度   40000   49  30333.333333
3      阿里   39000   42  29250.000000
4      百度    8000   28  30333.333333
5      腾讯   47000   23  31000.000000
6      腾讯   25000   45  31000.000000
7      阿里   16000   21  29250.000000
8      腾讯   21000   34  31000.000000
9      阿里   38000   29  29250.000000

通过上面的数据可以看出,利用transform输出既得到了统计数据,形状也没有变化。

当然,也可对多个数据列进行计算

data.groupby('company')[['salary', 'age']].transform('mean')
         salary   age
0  30333.333333  34.0
1  29250.000000  31.5
2  30333.333333  34.0
3  29250.000000  31.5
4  30333.333333  34.0
5  31000.000000  34.0
6  31000.000000  34.0
7  29250.000000  31.5
8  31000.000000  34.0
9  29250.000000  31.5

我们也可以用map函数实现类似的功能,但是稍微复杂点,但是有助于我们理解transform的含义。

avg_dict = data.groupby('company')['salary'].mean().to_dict()
avg_dict#得到了一个平均工资的字典
{'百度': 30333.333333333332, '腾讯': 31000.0, '阿里': 29250.0}
#利用map函数,将得到的字典映射到对应的列
data['salary_mean'] = data['company'].map(avg_dict)
data
company  salary  age   salary_mean
0      百度   43000   25  30333.333333
1      阿里   24000   34  29250.000000
2      百度   40000   49  30333.333333
3      阿里   39000   42  29250.000000
4      百度    8000   28  30333.333333
5      腾讯   47000   23  31000.000000
6      腾讯   25000   45  31000.000000
7      阿里   16000   21  29250.000000
8      腾讯   21000   34  31000.000000
9      阿里   38000   29  29250.000000

以图解的方式来看看进行groupby后transform的实现过程(公司列包含ABC,salary列为每个员工的工资明细):

上图中的大方框是transform和agg 所不一样的地方,对agg而言,会计算并聚合得到 A,B,C 公司对应的均值并直接返回,每个公司一条数据,但对transform而言,则会对每一条数据求得相应的结果,同一组内的样本会有相同的值,组内求完均值后会按照原索引的顺序返回结果。

以上就是分享Pandas中的一些宝藏函数transform()的详细内容,更多关于Pandas函数transform()的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python自定义聚合函数merge与transform区别详解

    1.自定义聚合函数,结合agg使用 2. 同时使用多个聚合函数 3. 指定某一列使用某些聚合函数 4.merge与transform使用 import pandas as pd import numpy as np np.random.seed(1) dict_data = { 'k1': ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'], 'k2': ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'], 'data1': np.ra

  • Python pandas自定义函数的使用方法示例

    本文实例讲述了Python pandas自定义函数的使用方法.分享给大家供大家参考,具体如下: 自定义函数的使用 import numpy as np import pandas as pd # todo 将自定义的函数作用到dataframe的行和列 或者Serise的行上 ser1 = pd.Series(np.random.randint(-10,10,5),index=list('abcde')) df1 = pd.DataFrame(np.random.randint(-10,10,(

  • pandas中apply和transform方法的性能比较及区别介绍

    1. apply与transform 首先讲一下apply() 与transform()的相同点与不同点 相同点: 都能针对dataframe完成特征的计算,并且常常与groupby()方法一起使用. 不同点: apply()里面可以跟自定义的函数,包括简单的求和函数以及复杂的特征间的差值函数等(注:apply不能直接使用agg()方法 / transform()中的python内置函数,例如sum.max.min.'count'等方法) transform() 里面不能跟自定义的特征交互函数,

  • pandas数据处理进阶详解

    一.pandas的统计分析 1.关于pandas 的数值统计(统计detail 中的 单价的相关指标) import pandas as pd # 加载数据 detail = pd.read_excel("./meal_order_detail.xlsx") print("detail :\n", detail) print("detail 的列索引名称:\n", detail.columns) print("detail 的形状:\n

  • 分享Pandas库中的一些宝藏函数transform()

    Pandas函数的核心功能是,既计算了统计值,又保留了明细数据.为了更好地理解transform和agg的不同,下面从实际的应用场景出发进行对比. aggregation会返回数据的缩减版本,而transformation能返回完整数据的某一变换版本供我们重组.这样的transformation,输出的形状和输入一致.一个常见的例子是通过减去分组平均值来居中数据. #数据构造 data = pd.DataFrame( {"company":['百度', '阿里', '百度', '阿里'

  • Python pandas库中isnull函数使用方法

    前言: python的pandas库中有⼀个⼗分便利的isnull()函数,它可以⽤来判断缺失值,我们通过⼏个例⼦学习它的使⽤⽅法.⾸先我们创建⼀个dataframe,其中有⼀些数据为缺失值. import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(10,99,size=(10,5))) df.iloc[4:6,0] = np.nan df.iloc[5:7,2] = np.nan df.iloc[7,

  • Python pandas库中的isnull()详解

    问题描述 python的pandas库中有一个十分便利的isnull()函数,它可以用来判断缺失值,我们通过几个例子学习它的使用方法. 首先我们创建一个dataframe,其中有一些数据为缺失值. import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(10,99,size=(10,5))) df.iloc[4:6,0] = np.nan df.iloc[5:7,2] = np.nan df.iloc[

  • python pandas库中DataFrame对行和列的操作实例讲解

    用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.arange(3.)) data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) data['w'] #选择表格中的'w'列,使用类字典属性,返回的是S

  • python中pandas库中DataFrame对行和列的操作使用方法示例

    用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.arange(3.)) data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) data['w'] #选择表格中的'w'列,使用类字典属性,返回的是S

  • pandas库中to_datetime()方法的使用解析

    目录 pandas to_datetime()的使用 学习目标 代码如下 运行结果 用pandas.to_datetime进行日期解析 pandas to_datetime()的使用 学习目标 使用pandas将timestamp转换为datetime 我的csv数据(其中timesatamp数据为第一列): 使用pd.to_datetime() 将以上第一列的timestamp(时间戳)的值转化成datetime. 代码如下 # load data wireless_df = pd.read_

  • PHP SPL标准库中的常用函数介绍

    PHP SPL标准库中提供了一些函数用来处理如自动加载.迭代器处理等. spl_autoload_extensions()添加spl_autoload()可加载的文件扩展名 spl_autoload_register()注册函数到SPL __autoload函数栈中. 复制代码 代码如下: /*test1.php*/ <?php class Test1 { }   /*test2.lib.php*/ <?php class Test2 { }   /*test.php*/ <?php /

  • Pandas库之DataFrame使用的学习笔记

    1 简介 DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表. 或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matlab也可以用cell存放多类型数据),DataFrame的单元格可以存放数值.字符串等,这和excel表很像. 同时DataFrame可以设置列名columns与行名index,可以通过像matlab一样通过位置获取数据也可以通过列名和行名定位,具体方法在后面细说. 2 创建DataFrame 首先声

  • Angularjs中如何使用filterFilter函数过滤

    AngularJS的filter,中文名"过滤器"是用来过滤变量的值,或者格式化输出,得到自己所期望的结果或格式的东东.AngularJS中有一个filterFilter函数用来对集合过滤,非常方便. 源代码大致如下: function filterFilter(){ return function(aray, expression comparator){ if(!isArray(array)) return array; var comparatorType = typeof(co

  • Python中openpyxl实现vlookup函数的实例

    相信很多学编程的人都对Vlookup函数不陌生,一些在excel中不方便处理的大量数据,用Python就可以轻松解决.下面介绍openpyxl库中如何实现vlookup函数 : 1.数据源介绍 如图所示,有一个" vlookup.xlsx "文件," A1:F11 "是我们的数据源区域," K1:L5 "是我们的查找源区域.我们的目的就是要在数据源区域的 G 列加一列数据,查找出不同类型下名称表示. 2.Vlookup函数介绍 这个函数我想大家应

随机推荐