【问题标题】:Allocating the Sub items to the main Items in pandas将子项目分配给熊猫中的主要项目
【发布时间】:2019-06-01 17:16:24
【问题描述】:

我正在寻找基于主要代码的 pandas/python 解决方案来汇总/分组发票中的项目。 请参考第一张附图

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

答案应该如下

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

注意事项

  1. 项目组合可以重复。例如,参见绿色和蓝色
  2. 一旦完成,应删除子项(例如删除第 371 项)。
  3. totalamt 应等于单个商品价格 X 数量的总和
  4. 在此示例中,所有子项代码均为 371。但它可能有多个代码。例如 371、58 等
  5. 子项目 371 可以单独出售,无需 MainCode。在这种情况下,它不应该被分配而应该保留。

更新数据

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    希望你喜欢它。下次请不要以图像的形式提供输入数据,而是以文本的形式提供。

    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
    

    【讨论】:

    • 非常感谢@Zaraki。你的回答太棒了。非常感谢这一点。我想强调一点,当有重复/重复的情况时,我没有得到正确的答案。参考我用绿色和蓝色编码的示例颜色。 (注意事项部分中的第 1 点)。在这种情况下,我没有得到想要的输出。我该如何解决这个问题?
    • @Rapto 您需要更改值的索引选择以选择一个元素并添加循环以收集所有索引。代码已更新。享受 =^..^=
    • 感谢您的更新。更新后的代码实际上只添加了第一个条目。在上面的例子中,它工作得很好。因为。在绿色和蓝色行中,项目 260 具有相同的数量 3。我在数据中犯了一个错误。在 BLUE 行中,我想提到该项目重复但数量可能不同。例如,项目 260 的绿色线数量 3 和蓝色数量 1。类似地对应的项目 #371 分别具有 3 和 1 数量。这应该是正确的数据。
    • 所以在这里,我们是否需要在添加数据时删除已使用的行?而不是等到循环结束。 # remove used linesdata = data.drop(remove_index)
    • @Rapto 不知道您需要什么?提供正确的开始数据和所需的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多