Python 同时迭代和更新数据帧
我有一个包含Python 同时迭代和更新数据帧,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个包含级别、产品ID和成本的数据框。 此处级别1表示它是一个主产品,级别2表示它是一个子产品,级别进一步提高表示子产品的多个子产品 Level Product ID Cost 0 1 111 12 1 1 112 15 . . . 25 1 294 32 我需要在上面的数据框上迭代,并在数据库中搜索是否有任何具有特定产品ID的产品具有子产品。例如,具有
级别、产品ID和成本的数据框。
此处级别1
表示它是一个主产品,级别2
表示它是一个子产品,级别进一步提高表示子产品的多个子产品
Level Product ID Cost
0 1 111 12
1 1 112 15
.
.
.
25 1 294 32
我需要在上面的数据框上迭代,并在数据库中搜索是否有任何具有特定产品ID的产品具有子产品。例如,具有产品ID 112的产品可以具有具有产品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()```
这是类似的说明。获取产品ID并将其转换为字符串。将产品ID的字符1放入其自己的“pid1”列中,对第二个字符“pid2”和第三个字符“pid3”以及“pid4”(N-1列)执行相同的操作
这将为您提供所有4级内容(5级内容的总和)
这会让你得到所有的3级的东西
注意:这是一种糟糕的格式,因为它假设您只拥有这些东西。请提供一个最小且可复制的代码示例?stackoverflow.com/help/minimal-repeatable-example这里有很多未知因素-格式化您的问题并添加完整的逻辑。基本的解决方案很简单-在每一个级别上,对级别2应用*10的倍数,对级别3应用*100的倍数,然后使用groupby
和add
&cumcount
@datanovel请根据我尝试过的代码详细说明您的答案。
df.groupby(['pid1','pid2','pid3','pid4']).agg({'cost':'sum'})
df.groupby(['pid1','pid2','pid3']).agg({'cost':'sum'})