我有一个包含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()```
答案 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个带有子装配的产品,或者一个子装配不能在其他产品中使用,这是一种糟糕的格式。