pandas 匹配另一个 Dataframe 中的唯一组-一对多匹配

628mspwn  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(135)

df1是盒子里的信息,每个盒子都有不同的体积大小,盒子A的体积是30,盒子B的体积是25,以此类推。

df1 = pd.DataFrame({'boxID':['A', 'B', 'C', 'D'],'volume':[30,25,30,10]})
df1.set_index("boxID")
    volume
boxID   
A   30
B   25
C   30
D   10

df2为产品信息,每种产品金额不同

df2 = pd.DataFrame({'Product No':['1', '2', '3', '4', '5', '6', '7'],'amount':[10, 5, 13, 15, 20, 10, 17]})
df2.set_index("Product No")
    amount
Product No  
1   10
2   5
3   13
4   15
5   20
6   10
7   17

将**“box id”列插入到df2中,以查找并匹配df1.**的相应box id,如底部的数据框。

output_df2 = pd.DataFrame({'Product No':['1', '2', '3', '4', '5', '6', '7'],'amount':[10, 5, 13, 15, 20, 10, 17], 'box ID':['A', 'A', 'A', 'B', 'C', 'C', 'D']})
output_df2.set_index("Product No")

    amount  box ID
Product No      
1   10  A
2   5   A
3   13  A
4   15  B
5   20  C
6   10  C
7   17  D

从上到下依次添加量(df2),以接近每箱体积(df1),但不超过每箱体积
例如,由于df1的第一个箱体积为30,因此它可以包含df2与第二行(amout 5)和第三行(amount 13)的第一行乘积(amount 10),因为10+5+13 = 28,所以等于30。(但是,如果您将第四行相加,则10+5+13+15 = 43,超过30
Python还是一个初学者,所以请各位Maven给予我一些建议,这对我来说是一个非常重要的任务。
匹配DF2中的盒ID列中DF1的适当盒ID。

92dk7w1h

92dk7w1h1#

单向使用pandas.cut

s1 = df1["volume"].cumsum()
s2 = df2["amount"].cumsum()

df2["box ID"] = pd.cut(s2, [0, *s1], labels=s1.index)
print(df2)

输出:

amount box ID
Product No               
1               10      A
2                5      A
3               13      A
4               15      B
5               20      C
6               10      C
7               17      D

相关问题