pythontransform⽅法_transform函数(来⾃
PythonPandas)。。。
简介
Pandas(Python)中的transform函数⼀开始可能有点难以理解,并且⼤多数数据科学家不会马上使⽤到它。 但对于数据科学家来说,transform函数是⼀个⽤于数据清洗、转换或者⽣成报表的⾮常⽅便的⼯具,尤其是对于⼤量数据的处理速度上。
应⽤实例
考虑这样⼀个例⼦,我们有来⾃某商店的表格如下:某商店的销售数据
⽽我们希望⽣成⼀个新列,统计每个⽤户的平均购买额,如下:我们希望⽣成的表
我们起码有两种⽅法实现这个操作:先采⽤groupby计算平均并⽣成⼀个新的dataframe,再和上⼀个dataframe进⾏merge
采⽤transform函数
第⼀种⽅法:
import pandas as pd
# 读取数据
ad_csv(“purchase.csv”)
# 1.⽣成新的dataframe,计算mean
mean_purchase =df.groupby('User_ID')["Purchase"].mean().rename("User_mean").reset_index()
# 2.和上⼀步的dataframe合并
df_1 = df.merge(mean_purchase)
第⼆种⽅法:
# 直接使⽤transform函数
df["User_Mean"] = df.groupby('User_ID')["Purchase"].transform('mean')
很明显,使⽤transform函数⾮常清晰快捷地达到了我们的⽬标。
transform函数有多快?
⾄于transform函数⽐groupby-merge能快多少,我们可以⽤⼀个1000000⾏的数据来验证这个想法。
⾸先⽣成⼀个1000000⾏的数据:
import pandas as pd
import random
data = pd.DataFrame({
'C' : [random.choice(('a','b','c')) for i in range(1000000)],
'A' : [random.randint(1,10) for i in range(1000000)],
'B' : [random.randint(1,10) for i in range(1000000)]
})
然后分别计算两种⽅法的时间:
第⼀种⽅法:
%%timeit
mean =upby('C')["A"].mean().rename("N").reset_index()
df_1 = (mean)
我在anaconda的ipython⾥的Output为:268 ms ± 4.33 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
第⼆种⽅法:
%%timeit
data['N1'] = upby(['C'])['A'].transform('mean')
这个得到的output为:68.4 ms ± 590 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
可以看出,具有⼤量数据的情况下,transform函数⽐groupby-merge要快得多,并且代码更加简洁清晰,不会带来中间产物(groupby-merge会产⽣⼀个中间的dataframe,如果写在⼀起的话会使函数嵌套层数过多)
transform和apply函数有什么区别?
groupby是什么函数
我尝试了⼀些情景,发现这两个函数的功能有很多重叠:
df = pd.DataFrame({'A': range(3), 'B': range(1, 4)})
# 下⾯两个call得到的结果相同
df.apply(lambda x: x+1)
# 下⾯两个call得到的结果也相同
df['d']=df.transform(lambda x: x.A+x.B, axis=1)
df['d']=df.apply(lambda x: x.A+x.B, axis=1)
# 下⾯两个call得到的结果还是相同
df.apply([np.exp,np.sqrt])
transform函数的官⽅⽂档是这么介绍的:
Call func on self producing a DataFrame with transformed values.
Produced DataFrame will have same axis length as self.
看上去和apply区别没有很⼤。但起码在我刚刚列举的那个场景中,transform函数是很好⽤的。
如果⼤家有其他的发现,欢迎留⾔探讨~