同时迭代和更新熊猫数据框

时间:2020-03-31 09:49:23

标签: python python-3.x pandas dataframe

我有一个包含Level, Product ID and Cost的数据框。 Level 1表示它是主要产品,Level 2表示它是子产品,等级的进一步提高表示子产品的多个子产品。

    Level    Product ID    Cost
0   1         111           12
1   1         112           15
.
.
.
25  1         294           32

我需要对上述数据框进行迭代,并在数据库中搜索是否有任何具有特定产品ID的产品具有子产品。例如,产品ID为112的产品可以有2个产品ID为1121和1122的子产品。然后,我需要在数据框中添加这2个子产品。

注意:产品ID可以是任何数字或字符串。它不必是其基本产品ID的倍数。

这里的另一个条件是子产品可以具有其他子产品。例如,子产品1122可以具有3个子产品11221、11222、11223。

此外,如果产品具有子产品,则产品的成本应等于其所有子产品的成本之和。

最终数据框必须看起来像这样。

    Level    Product ID    Cost
0   1        111           12
1   1        112           15
2   2        1121          8
3   2        1122          7
4   3        11221         2
5   3        11222         3
6   3        11223         2
.
.
.
27  1        294           32

有人可以帮助我实现此解决方案吗?下面是我尝试过的代码。

for i, _ in multi_bom_df.iterrows():
        if i == 0:
            multi_bom_df.at[i, 'Level'] = '1'
        else:
            multi_bom_df.at[i, 'Level'] = str(current_level)
            base_part_number = str(multi_bom_df.loc[i]['Name'])
            sub_assemblies = models.MultiLevel.objects.filter(base_part=base_part)
            if sub_assemblies.exists():
                current_level += 1
                for index, record in enumerate(sub_assemblies):
                    sub_index = i + (index + 1) / 10
                    multi_bom_df.at[sub_index, 'Level'] = current_level
                    multi_bom_df.at[sub_index, 'Product ID'] = record.sub_assembly_product_id
                    multi_bom_df.at[sub_index, 'Cost'] = record.cost
                multi_bom_df.index = multi_bom_df.index.astype(float)
                multi_bom_df = multi_bom_df.sort_index()```

1 个答案:

答案 0 :(得分:0)

以下是有关此类内容的说明。获取产品ID并将其转换为字符串。将产品ID的字符1放入其自己的列“ pid1”中,对第二个字符“ pid2”和“ pid3”进行相同的操作,对第三个字符以及“ pid4”(N-1列)进行相同操作

df.groupby(['pid1','pid2','pid3','pid4']).agg({'cost':'sum'})

这将使您获得所有4级的东西(5级东西的总和)

df.groupby(['pid1','pid2','pid3']).agg({'cost':'sum'})

这将使您获得所有3级知识。

注意:如果您假设只有<1000个带有子装配的产品,或者一个子装配不能在其他产品中使用,这是一种糟糕的格式。