数据帧:订单供应匹配

2024-05-16 04:29:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python或pandas编码非常陌生。所以我在这里有点震惊,任何意见都很感谢。 我有两个df,分别根据标准订购。 df1:包含数量的订单列表 df2:具有可用数量和日期的存货清单。数量不一定等于订单数量

我需要在df1中弹出第一个订单,并在df2中不断弹出库存,直到满足订单数量,并保持完成订单所需的库存数量

任何帮助都将不胜感激

Example 

df 1: 
order1 5
order2 4
order3 5

df 2: inventories 
inven1 7 07/06/2020
inven2 7 07/10/2020

my final output should look like this.

inven1 | 5 | 07/06/2020 | order1 
inven1 | 2 | 07/06/2020 | order2 
inven2 | 2 | 07/10/2020 | order2
inven2 | 5 | 07/10/2020 | order3 

@Ian 感谢您的回答,它工作得非常好,我唯一的问题是,这些库存和订单必须基于metaID进行匹配,metaID中的库存应该应用于相同metaID的订单

我尝试通过metaID循环并执行订单库存匹配,如下所示。我得到了我想要的结果,但最大的问题是,仅2K行的数据大小需要20分钟

我试图通过按metaID对订单和库存进行排序并传递整个数据帧来解决这个问题。当订单和库存有精确匹配的计数时,它就起作用了

df 1: 
metaId1 order1 5
metaId1 order2 4
metaId1 order3 5
metaId2 order4 10

df 2: inventories 
metaId1 inven1 7 07/06/2020
metaId1 inven2 7 07/10/2020
metaId2 inven3 10 07/10/2020

my final output is all fine.

metaId1 | inven1 | 5 | 07/06/2020 | order1 
metaId1 | inven1 | 2 | 07/06/2020 | order2 
meatId1 | inven2 | 2 | 07/10/2020 | order2
metaId1 | inven2 | 5 | 07/10/2020 | order3 
metaId2 | inven3 | 10 | 07/10/2020 | order4 

但metaId之间的交叉发生在库存过剩或短缺时,因为我们是基于索引进行匹配的。如何基于metaId进行匹配,然后在其中通过索引进行匹配。我使用的for-loop解决方案需要花费大量数据,我知道这不是正确的解决方案。每个metaId下的顺序匹配可以并行进行,并且可以合并结果。这就是我使用for循环的方式。我不知道如何在python/pandas中并行化它们,或者不知道有比并行计算更好的解决方案。看起来我需要应用groupBy apply combine概念,但是我看到了这个概念的示例,使用单个数据帧,并对该行应用一些逻辑,然后组合它。我的问题是,我有两个数据帧,必须分组,并将“combine-first()”解决方案应用于该组,并合并每个组的结果。我不知道怎么做。你能帮我吗

current problem 

df 1: 
metaId1 order1 5
metaId1 order2 4
metaId1 order3 5
metaId2 order4 10

df 2: inventories 
metaId1 inven1 7 07/06/2020
metaId1 inven2 5 07/10/2020
metaId2 inven3 10 07/10/2020


final output : --> not right 

metaId1 | inven1 | 5 | 07/06/2020 | order1 
metaId1 | inven1 | 2 | 07/06/2020 | order2 
meatId1 | inven2 | 2 | 07/10/2020 | order2
metaId1 | inven2 | 3 | 07/10/2020 | order3 
metaId2 | inven3 | 2 | 07/10/2020 | order3 -->crossover
metaId2 | inven3 | 8 | 07/10/2020 | order4

expected output : 
metaId1 | inven1 | 5 | 07/06/2020 | order1 
metaId1 | inven1 | 2 | 07/06/2020 | order2 
meatId1 | inven2 | 2 | 07/10/2020 | order2
metaId1 | inven2 | 3 | 07/10/2020 | order3 
metaId1 | short  | 2 | 07/10/2020 | order3-->short by 2 inven to fulfill order
metaId2 | inven3 | 10 | 07/10/2020 | order4

Tags: 数据订单df数量库存order1order4order2
1条回答
网友
1楼 · 发布于 2024-05-16 04:29:40

创建df1:

从order 1=5开始,在一行中创建[order 1,order 1,order 1,order 1,order 1]的5个Elmenet。与订单2和订单3相同

import pandas as pd

df1 = pd.DataFrame({'Order Number':['order 1','order 2','order 3'],
              'Quantity':[5,4,3]})

df1 = df1.set_index('Order Number')
df1  = df1.loc[df1.index.repeat(df1['Quantity'])]
df1

创建df2:

从inven1=7,在一行中创建[inven1,inven1,inven1,inven1,inven1,inven1]的7个元素。与inven2相同

df2  = pd.DataFrame({'Batch':['inven1','inven2','inven3'],
                    'Quantity':[7,4,10],
                    'Date Available':['2020-07-06','2020-07-10','2020-07-12']
                    })

df2 = df2.set_index('Date Available')
df2 = df2.loc[df2.index.repeat(df2['Quantity'])]
df2

创建df3:

将所有订单放在一列中,将所有inven1放在另一列中,以使它们一一对应

确保在订单下更换NAs,以确定哪些库存没有匹配的订单号

df3 = df1.reset_index().combine_first(df2.reset_index()).reset_index()
#Make sure to replace NAs with "Available Stock"
df3['Order Number']  = df3['Order Number'].fillna('Available Stock')
df3

创建df4:

使用groupby创建一个数据透视表,显示按库存填写的每个订单的计数

df4 = df3.groupby(['Batch','Date Available','Order Number']).count().reset_index().drop(labels = ['index'], axis = 1)
df4

结果应显示:

    Batch   Date Available  Order Number       Quantity
0   inven1  2020-07-06      order 1            5
1   inven1  2020-07-06      order 2            2
2   inven2  2020-07-10      order 2            2
3   inven2  2020-07-10      order 3            2
4   inven3  2020-07-12      Available Stock    9
5   inven3  2020-07-12      order 3            1

资料来源:

  1. Concatenate two dataframes of different sizes (pandas)
  2. Repeat rows in a pandas DataFrame based on column value

相关问题 更多 >