通过另一个数据框的键确定的值,将一个数据框的列乘以另一个数据框的值

2024-09-29 21:29:28 发布

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

我想取一个大约有26000行的大型数据帧foodList,将foodList列['food\u quant']乘以dataframe foodConversions中的某个值。要从foodConversions确定此值,另一列foodList['food\u name']有一个对应于foodConversions索引的字符串。我这样做是为了把克数不同的食物转换成卡路里,每种食物都有不同数量的卡路里

我试过做嵌套循环来遍历foodConversions中的每个值,看看它是否等于foodList['food\u name'],但这太慢了,而且由于某种原因从来没有真正运行完;因此,我更愿意放弃这种方法。 我也尝试过使用applymap和lambda函数,但我认为我做得不对。 最后,我尝试使用另一个stackoverflow问题中概述的方法,但我不确定如何将其应用于我的情况,或者它是否适用于我的情况。下面是它的链接:Multiply dataframe with values from other dataframe

以下是两个数据帧:

foodConversions = pd.Dataframe([2,3], index=['meat','vegetables'], columns=['cal/gram'])
            cal/gram
meat        2
vegetables  3
foodList = pd.Dataframe([['meat',40]['meat',30]['vegetables',20]['meat',10]], columns=['food_name','food_quant'])
    food_name    food_quant
0   meat         40
1   meat         30
2   vegetables   20
3   meat         10

输出应该如下所示:

    food_name    food_quant
0   meat         80
1   meat         60
2   vegetables   60
3   meat         20

希望这是有意义的,我试图尽可能彻底,所以我很抱歉冗长的解释。谢谢大家的帮助


Tags: columns数据方法namedataframefood情况pd
2条回答

尝试使用:

print(foodList.set_index('food_name').mul(foodConversions.reindex(foodList['food_name'])['cal/gram'], axis=0).reset_index())

输出:

    food_name  food_quant
0        meat          80
1        meat          60
2  vegetables          60
3        meat          20

我们可以做reindexlocmap^{}

reindex|loc

df2.assign(food_quant=df2.food_quant*(df1['cal/gram'].reindex(df2.food_name).values))# change reindex to loc
Out[121]: 
    food_name  food_quant
0        meat          80
1        meat          60
2  vegetables          60
3        meat          20

map|replace

df2.assign(food_quant=df2.food_quant*df2.food_name.map(df1['cal/gram']))
df2.assign(food_quant=df2.food_quant*df2.food_name.replace(df1['cal/gram']))

相关问题 更多 >

    热门问题