考虑下面的数据文件
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方法中所做的类似吗
对于您在apply vs.transform上提供的优秀参考资料,我没有太多要补充的内容,但是您可以在不创建单独的数据帧的情况下做任何事情,例如,您可以这样做
这将使用groupby中每个组的
assign
来填充Total_Chocolate_Spend
所需的数字还有其他方法。例如:
使用
df.where
创建一个仅包含巧克力值的临时列:输出:
我不知道这是更有效还是更容易阅读
相关问题 更多 >
编程相关推荐