首页 > 解决方案 > 如何使用熊猫数据框进行此列时间行操作?

问题描述

我有一个与 pandas 中的矩阵运算有关的问题,这就是我想要实现的。

我有一个熊猫数据框,每一行对应于配方中包含的成分数量。 成分_包含_in_recipes

第二个数据框包含每种成分的营养数据。 营养数据

我想获得一个新的数据框,其中每一行对应于配方中成分*数量中所含营养素的总和。

对不起,如果我不够清楚,那是我第一次在这里发帖。谢谢你的帮助!

标签: pythonpandasdataframe

解决方案


您可以在此处使用点积来最有效地解决此问题。如果您不熟悉线性代数:https ://en.wikipedia.org/wiki/Dot_product 。我会解释一下,然后我的实现如下。

您有一个数据框,您的数据框包含每个配方中的成分数量,我们称之为quantities_df。在一行中,每个单元格对应一种成分。假设你有n配料。您的一个简短示例:

胡萝卜 酒杯 麝香
0 1 125 3
1 0 0 0
2 0 35 0
3 0 125 0

现在,您有了第二个数据框,其中包含每种成分的营养成分,称为nutrients_df. 该数据框的每个单元格对应于其中一种成分中的营养素含量。我们有n行,一个对应于每种成分。同样,一个简短的示例:

nrj_kcal 蛋白质_g 糖类_g 脂质_g
胡萝卜 40.2 0.63 7.59 0.5
酒杯 741 0.7 0.99 81.5
麝香 504 5.3 28.5 36.3

让我们将一个配方的点积按一列计算。我们有:

1 * 40.2 + 125 * 741 + 3 * 504 = 94177.2

换句话说,您拥有每种成分的产品总和及其营养成分。如果您按每列对每一行进行点积,即矩阵积,您将得到预期的结果。

这是我的实现:

假设您已经拥有quantities_dfand nutrients_df

import pandas as pd
import numpy as np

recipe_nutrients = pd.DataFrame(
                       data=np.dot(quantities_df.values, nutrients_df.values),
                       columns=nutrients_df.columns
                   )

这看起来符合预期:

nrj_kcal 蛋白质_g 糖类_g 脂质_g
0 94177.2 104.03 216.84 10296.9
1 0 0 0 0
2 25935 24.5 34.65 2852.5
3 92625 87.5 123.75 10187.5

推荐阅读