繁体   English   中英

Pandas 将应用结果转换回原始结果 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 对一个系列起作用。

对一组应用 vs 转换 object

因此,如果我想要 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM