【问题标题】:Pandas Transforming the Applied Results back to the original dataframePandas 将应用结果转换回原始数据框
【发布时间】:2021-01-14 16:23:01
【问题描述】:

考虑以下 DataFrame

candy = pd.DataFrame({'Name':['Bob','Bob','Bob','Annie','Annie','Annie','Daniel','Daniel','Daniel'], 'Candy': ['Chocolate', 'Chocolate', 'Lollies','Chocolate', 'Chocolate', 'Lollies','Chocolate', 'Chocolate', 'Lollies'], 'Value':[15,15,10,25,30,12,40,40,16]})

阅读以下帖子后,我知道 apply 适用于整个 Dataframe,而 transform 适用于一系列。

Apply vs transform on a group object

因此,如果我想附加每人在糖果上的总花费,我可以简单地使用以下内容。

candy['Total Spend'] = candy.groupby(['Name'])['Value'].transform(sum)

但如果我需要追加每人的巧克力总花费 - 感觉我别无选择,只能创建一个单独的数据框,然后使用 apply 函数将其合并回来,因为 transform 仅适用于系列。

chocolate = candy.groupby(['Name']).apply(lambda x: x[x['Candy'] == 'Chocolate']['Value'].sum()).reset_index(name = 'Total_Chocolate_Spend')
candy = pd.merge(candy, chocolate, how = 'left',left_on=['Name'], right_on=['Name'])

虽然我不介意编写上面的代码来解决这个问题。是否可以将应用的结果“转换”回数据帧,而无需创建单独的数据帧并合并它?

使用变换函数时实际发生了什么?是否将单独的系列存储在内存中,然后通过类似于我在应用然后合并方法中所做的索引合并回来?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    还有其他方法。例如:

    使用df.where 创建一个仅包含巧克力值的临时列:

    candy["choc_val"] = candy.Value.where(candy.Candy =="Chocolate", other=0)
    candy["Total_Chocolate_Spend"] = candy.groupby("Name").choc_val.transform(sum)
    candy = candy.drop(columns="choc_val")
    

    输出:

         Name      Candy  Value  Total Spend  Total_Chocolate_Spend
    0     Bob  Chocolate     15           40                     30
    1     Bob  Chocolate     15           40                     30
    2     Bob    Lollies     10           40                     30
    3   Annie  Chocolate     25           67                     55
    4   Annie  Chocolate     30           67                     55
    5   Annie    Lollies     12           67                     55
    6  Daniel  Chocolate     40           96                     80
    7  Daniel  Chocolate     40           96                     80
    8  Daniel    Lollies     16           96                     80
    

    我不知道这是否更高效或更易于阅读。

    【讨论】:

    • 感谢您的回答,虽然我已经接受了 Piterbarg 的另一个回答,因为它保留了原始的应用功能。
    【解决方案2】:

    对于您在应用与转换方面提供的出色参考,我没有太多要补充的内容,但您可以做您想做的事,而无需创建单独的数据框,例如,您可以这样做

    candy.groupby(['Name']).apply(lambda x: x.assign(Total_Chocolate_Spend = x[x['Candy'] == 'Chocolate']['Value'].sum()))
    

    这对 groupby 中的每个组使用 assign 以使用您想要的数字填充 Total_Chocolate_Spend

    【讨论】:

    • 这就是我要找的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2017-11-22
    • 2018-01-21
    • 1970-01-01
    • 2020-01-02
    • 2020-11-27
    相关资源
    最近更新 更多