将应用的结果转换回原始数据帧

2024-09-30 20:28:11 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑下面的数据文件

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可以在整个数据帧上工作,transform可以在一个系列上工作

Apply vs transform on a group object

因此,如果我想增加每人在糖果上的总花费,我可以简单地使用以下方法

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

但是,如果我需要追加每人总共$chocolate的花费,我感觉我别无选择,只能创建一个单独的数据帧,然后使用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'])

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

使用transform函数时实际发生了什么?一个单独的序列存储在内存中,然后通过索引合并回来,这与我在apply-then-merged方法中所做的类似吗


Tags: 数据namevalueontransformpdbobapply
2条回答

对于您在apply vs.transform上提供的优秀参考资料,我没有太多要补充的内容,但是您可以在不创建单独的数据帧的情况下做任何事情,例如,您可以这样做

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

这将使用groupby中每个组的assign来填充Total_Chocolate_Spend所需的数字

还有其他方法。例如:

使用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

我不知道这是更有效还是更容易阅读

相关问题 更多 >