新手向——理解Pandas的Transform

作者: treelake | 来源:发表于2017-04-09 17:25 被阅读792次

    Understanding the Transform Function in Pandas

    • Pandas具有丰富的功能让我们探索,transform就是其中之一,利用它可以高效地汇总数据。
    • Python Data Science Handbook 是一个关于pandas的优秀资源。
    • 在该书的描述中,transform是与groupby(pandas中最有用的操作之一)组合使用的。一般情况下,我们在groupby之后使用aggregate , filter 或 apply来汇总数据,transform可能稍难理解。
    • 该书对应的github资源 jupyter notebooks里的内容可能对理解transform的独特作用有所帮助。

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

    实践

    • 加载数据
    import pandas as pd
    
    df = pd.read_excel("sales_transactions.xlsx")
    
    • 查看数据
    • 可以看到数据包含了不同的订单(order),以及订单里的不同商品的数量(quantity)、单价(unit price)和总价(ext price)
    • 现在我们的任务是为数据表添加一列,表示不同商品在所在订单的价钱占比。
    • 首先我们要获得每个订单的总花费。groupby可以实现。
    df.groupby('order')["ext price"].sum()
    
    order
    10001     576.12
    10005    8185.49
    10006    3724.49
    Name: ext price, dtype: float64
    
    • 这些新得到的数据如何与原始数据帧结合呢?
    order_total = df.groupby('order')["ext price"].sum().rename("Order_Total").reset_index()
    
    df_1 = df.merge(order_total)
    df_1["Percent_of_Order"] = df_1["ext price"] / df_1["Order_Total"]
    

    • 我们实现了目标(还多加了一列订单总额),但是步骤比较多,有没有更好的办法呢?——主角出场:)

    Transform

    • 我们先试下
    df.groupby('order')["ext price"].transform('sum')
    
    0      576.12
    1      576.12
    2      576.12
    3     8185.49
    4     8185.49
    5     8185.49
    6     8185.49
    7     8185.49
    8     3724.49
    9     3724.49
    10    3724.49
    11    3724.49
    dtype: float64
    
    • 不再是只显示3个订单的对应项,而是保持了与原始数据集相同数量的项目,这样就很好继续了。这就是transform的独特之处。
    df["Order_Total"] = df.groupby('order')["ext price"].transform('sum')
    df["Percent_of_Order"] = df["ext price"] / df["Order_Total"]
    
    • 甚至可以一步:
    df["Percent_of_Order"] = df["ext price"] / df.groupby('order')["ext price"].transform('sum')
    

    相关文章

      网友评论

      本文标题:新手向——理解Pandas的Transform

      本文链接:https://www.haomeiwen.com/subject/nbddattx.html