[英]performing math on dataframe variables after groupby in pandas and bringing results back to original dataframe
[英]Pandas Transforming the Applied Results back to the original dataframe
考虑以下 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 对一个系列起作用。
因此,如果我想要 append 人均糖果总花费,我可以简单地使用以下内容。
candy['Total Spend'] = candy.groupby(['Name'])['Value'].transform(sum)
但是,如果我需要 append 人均巧克力消费总额 - 感觉我别无选择,只能创建一个单独的 dataframe,然后使用 apply function 将其合并回去,因为转换仅适用于系列。
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'])
虽然我不介意编写上面的代码来解决这个问题。 是否可以将应用的结果“转换”回 dataframe 而无需创建单独的 dataframe 并将其合并?
使用转换 function 时实际发生了什么? 一个单独的系列是否存储在 memory 中,然后通过索引合并回来,类似于我在应用然后合并方法中所做的?
还有其他方法。 例如:
使用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")
output:
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
我不知道这是否更高效或更易于阅读。
对于您在应用与转换方面提供的出色参考,我没有太多要补充的内容,但是您可以做您想做的事而无需创建单独的 dataframe,例如您可以做
candy.groupby(['Name']).apply(lambda x: x.assign(Total_Chocolate_Spend = x[x['Candy'] == 'Chocolate']['Value'].sum()))
这使用assign
groupby 中的每个组来用你想要的数字填充Total_Chocolate_Spend
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.