网站后台更新缓存失败,安徽建筑管理人员信息网,收到网站打入0.1元怎么做分录,小型的电商网站有哪些文章目录 1. 介绍transform#xff1a;apply#xff1a; 2. 应用示例示例数据使用transform进行向量化操作使用apply进行更复杂的操作性能比较 3. 示例输出使用 transform 进行向量化操作使用 apply 进行更复杂的操作 4. transform再举例示例数据使用transform计算平均销售额… 文章目录 1. 介绍transformapply 2. 应用示例示例数据使用transform进行向量化操作使用apply进行更复杂的操作性能比较 3. 示例输出使用 transform 进行向量化操作使用 apply 进行更复杂的操作 4. transform再举例示例数据使用transform计算平均销售额输出 1. 介绍
在Pandas中transform和apply都可以用于对分组数据进行操作但它们有不同的使用场景和性能特性
transform
返回与输入相同大小的DataFrametransform函数应用于每个分组后会将结果广播到原始数据的大小这通常使得transform更高效。性能优化transform通常会尝试用更高效的内部机制来执行向量化操作。限制由于结果会被广播到原始数据的大小因此transform应用的函数应返回标量值或与输入组相同大小的数组。
apply
更为通用apply适用于更复杂的操作包括改变DataFrame的大小。灵活性apply可以用于执行更多种类的操作例如可以返回DataFrame、Series或标量。可能性能较低apply的通用性通常意味着它在性能上不如transform高效尤其是在需要广播结果到原始数据大小的场景。
因此当操作可以使用transform完成时通常更推荐使用transform以获取更好的性能。当需要更大的灵活性时例如改变输出的形状或进行更复杂的计算则可以使用apply。
2. 应用示例
当然以下是一些应用示例来说明transform和apply的不同用途和性能特性。
示例数据
假设我们有以下DataFrame它表示三个不同产品在不同日期的销售额
import pandas as pddata {Date: [2021-01-01, 2021-01-01, 2021-01-02, 2021-01-02, 2021-01-03, 2021-01-03],Product: [A, B, A, A, B, C],Revenue: [100, 150, 200, 50, 300, 400]}
df pd.DataFrame(data)使用transform进行向量化操作
如果我们想要在原DataFrame中添加一个新列该列表示每个产品的总销售额我们可以使用transform
df[Total_Revenue_By_Product] df.groupby(Product)[Revenue].transform(sum)transform将自动广播每个组的结果即每个产品的总销售额到该组内所有行。
使用apply进行更复杂的操作
假设我们想要获得每个产品最高单日销售额的日期这是一个更复杂的操作可以使用apply
def get_max_revenue_date(group):return group.loc[group[Revenue].idxmax(), Date]max_revenue_date df.groupby(Product).apply(get_max_revenue_date)这里apply允许我们对每个组使用更复杂的函数并且返回一个与输入形状不同的结果。
性能比较
通常在可以使用transform的场合使用transform会更高效。例如如果我们有一个非常大的DataFrame使用transform来计算组平均值通常会比使用apply更快。
3. 示例输出
当然让我说明一下各个示例的输出。
使用 transform 进行向量化操作
如果我们运行这段代码
df[Total_Revenue_By_Product] df.groupby(Product)[Revenue].transform(sum)df 会被更新新增了一个列 Total_Revenue_By_Product它包含每个产品的总销售额并会广播到该产品的所有记录。
更新后的 df 如下 Date Product Revenue Total_Revenue_By_Product
0 2021-01-01 A 100 350
1 2021-01-01 B 150 450
2 2021-01-02 A 200 350
3 2021-01-02 A 50 350
4 2021-01-03 B 300 450
5 2021-01-03 C 400 400如您所见产品A、B、和C的总销售额分别是350、450和400这些值被广播到了每一行对应的产品。
使用 apply 进行更复杂的操作
如果我们运行这段代码
def get_max_revenue_date(group):return group.loc[group[Revenue].idxmax(), Date]max_revenue_date df.groupby(Product).apply(get_max_revenue_date)max_revenue_date 会是一个 Series其中包含每个产品销售额最高的日期
Product
A 2021-01-02
B 2021-01-03
C 2021-01-03
dtype: object这里我们可以看到产品A、B、和C销售额最高的日期分别是 2021-01-02、2021-01-03 和 2021-01-03。
4. transform再举例
当然下面是另一个使用transform的例子。这次我们将计算每个产品的平均销售额并将该信息添加为新的列。
示例数据
我们还是使用相同的数据集
data {Date: [2021-01-01, 2021-01-01, 2021-01-02, 2021-01-02, 2021-01-03, 2021-01-03],Product: [A, B, A, A, B, C],Revenue: [100, 150, 200, 50, 300, 400]}
df pd.DataFrame(data)使用transform计算平均销售额
df[Average_Revenue_By_Product] df.groupby(Product)[Revenue].transform(mean)运行这行代码后df会更新新增一个列Average_Revenue_By_Product其中包含每个产品的平均销售额。
输出
更新后的df会是这样 Date Product Revenue Average_Revenue_By_Product
0 2021-01-01 A 100 116.666667
1 2021-01-01 B 150 225.000000
2 2021-01-02 A 200 116.666667
3 2021-01-02 A 50 116.666667
4 2021-01-03 B 300 225.000000
5 2021-01-03 C 400 400.000000如您所见产品A、B、和C的平均销售额分别是约116.67、225和400这些值被广播到了每一行对应的产品。