Python 将子项分配给表中的主要项

Python 将子项分配给表中的主要项,python,pandas,Python,Pandas,我正在寻找pandas/python解决方案来根据发票的主代码对发票中的项目进行汇总/分组。 请参阅第一个附加的图像 具有主代码的每个项目值(价格X数量)应添加到项目总数中。寻找相似的颜色。(请注意,某些项目可能会重复。例如:绿色和蓝色)不应添加数量。只有值 答案如下 我是熊猫队的新手&因为这是一个有点高级的问题,所以我想不出任何代码。因此,张贴在这里。请指示我解决这个问题 注意事项 项目组合可以重复。如绿色和蓝色 一旦完成,应删除子项(例如删除项目#371) totalamt应等于单个项

我正在寻找pandas/python解决方案来根据发票的主代码对发票中的项目进行汇总/分组。 请参阅第一个附加的图像

具有主代码的每个项目值(价格X数量)应添加到项目总数中。寻找相似的颜色。(请注意,某些项目可能会重复。例如:绿色和蓝色)不应添加数量。只有值

答案如下

我是熊猫队的新手&因为这是一个有点高级的问题,所以我想不出任何代码。因此,张贴在这里。请指示我解决这个问题

注意事项

  • 项目组合可以重复。如绿色和蓝色
  • 一旦完成,应删除子项(例如删除项目#371)
  • totalamt应等于单个项目的价格X数量的总和
  • 在此示例中,所有子项代码均为371。但它可能有几个代码。例371、58等
  • 子项371可单独出售,无需主代码。在这种情况下,它不应该被分配&它应该保留
  • 更新数据
    希望你喜欢。下次请提供输入数据,不是图像,而是文本

    import pandas as pd
    
    data_raw = [[260, 1500, 3, 0, 4500], [260, 1500, 1, 0, 1500], [258, 1500, 4, 0, 6000], [1054, 1200, 1, 0, 1200],
    [371, 700, 3, 260, 2100], [371, 700, 1, 260, 700], [371, 700, 1, 1054, 700], [371, 700, 4, 258, 2800]]
    
     data = pd.DataFrame(data_raw, columns=['item', 'price', 'qty','Main code','Total'])
    
    remove_index= []
    for index, row in data.iterrows():
         try:
             # find item in Main code
             main_code_data = data.loc[data['Main code'] == row['item']]
             # merge values
             data.at[index, 'Total'] = row['Total'] + row['qty']* (main_code_data['Total'].values[0]/main_code_data['qty'].values[0])
             # get indexes to remove
             for item in main_code_data.index:
                remove_index.append(item)
         except:
             # if no match
             pass
    
     # remove used lines
     data = data.drop(remove_index)
    
    输出:

       item  price  qty  Main code  Total
    0   260   1500    3          0   6600
    1   260   1500    1          0   2200
    2   258   1500    4          0   8800
    3  1054   1200    1          0   1900
    

    希望你喜欢。下次请提供输入数据,不是图像,而是文本

    import pandas as pd
    
    data_raw = [[260, 1500, 3, 0, 4500], [260, 1500, 1, 0, 1500], [258, 1500, 4, 0, 6000], [1054, 1200, 1, 0, 1200],
    [371, 700, 3, 260, 2100], [371, 700, 1, 260, 700], [371, 700, 1, 1054, 700], [371, 700, 4, 258, 2800]]
    
     data = pd.DataFrame(data_raw, columns=['item', 'price', 'qty','Main code','Total'])
    
    remove_index= []
    for index, row in data.iterrows():
         try:
             # find item in Main code
             main_code_data = data.loc[data['Main code'] == row['item']]
             # merge values
             data.at[index, 'Total'] = row['Total'] + row['qty']* (main_code_data['Total'].values[0]/main_code_data['qty'].values[0])
             # get indexes to remove
             for item in main_code_data.index:
                remove_index.append(item)
         except:
             # if no match
             pass
    
     # remove used lines
     data = data.drop(remove_index)
    
    输出:

       item  price  qty  Main code  Total
    0   260   1500    3          0   6600
    1   260   1500    1          0   2200
    2   258   1500    4          0   8800
    3  1054   1200    1          0   1900
    

    谢谢你,扎拉基。你的回答太棒了。非常感谢。。有一点我想强调,当存在重复/重复的情况时,我没有得到正确的答案。参考我的示例,颜色编码为绿色和蓝色。(注意事项部分第1点)。在这种情况下,我无法获得所需的输出。如何解决这个问题?@Rapto您需要更改值的索引选择以选择一个元素,并添加循环以收集所有索引。代码已更新。享受=^..^=感谢您的更新。更新后的代码实际上只添加了第一个条目。在上面的例子中,它工作得非常好。因为。在绿色和蓝色两行中,260项的数量相同,为3。我的数据出错了。在蓝线中,我想提到的是,项目重复,但数量可能不同。项目260的绿色线数量3和蓝色线数量1中的示例。类似地,对应的项目#371分别有3和1个数量。这应该是正确的数据。因此,在这里,我们是否需要在添加数据时删除使用过的行?而不是等到循环结束
    #删除用过的行
    data=data.drop(删除索引)
    @Rapto不知道你到底需要什么?提供正确的启动数据和所需的输出。非常感谢@Zaraki。你的回答太棒了。非常感谢。。有一点我想强调,当存在重复/重复的情况时,我没有得到正确的答案。参考我的示例,颜色编码为绿色和蓝色。(注意事项部分第1点)。在这种情况下,我无法获得所需的输出。如何解决这个问题?@Rapto您需要更改值的索引选择以选择一个元素,并添加循环以收集所有索引。代码已更新。享受=^..^=感谢您的更新。更新后的代码实际上只添加了第一个条目。在上面的例子中,它工作得非常好。因为。在绿色和蓝色两行中,260项的数量相同,为3。我的数据出错了。在蓝线中,我想提到的是,项目重复,但数量可能不同。项目260的绿色线数量3和蓝色线数量1中的示例。类似地,对应的项目#371分别有3和1个数量。这应该是正确的数据。因此,在这里,我们是否需要在添加数据时删除使用过的行?而不是等到循环结束
    #删除用过的行
    data=data.drop(删除索引)
    @Rapto不知道你到底需要什么?提供正确的启动数据和所需的输出。