匹配来自另一个数据帧的唯一组 - 一对多匹配

Match unique group from another dataframe - one to many match

提问人:ghost_like 提问时间:2/4/2023 更新时间:2/4/2023 访问量:70

问:

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

在 DF2 中插入“Box ID”列,以查找并匹配 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的第一行乘积(数量10),第二行(5)和第三行(数量13) 等于 30,因为 10+5+13 = 28。 (但是,如果加到第 4 行,则 10+5+13+15 = 43,即超过 30

Python 还是初学者,所以请给我很多专家的建议。这对我来说是一项非常重要的任务。

在 DF2 的 Box ID 列中匹配相应的 DF1 框 ID。

Python Pandas 数据帧 映射 匹配

评论


答:

1赞 Chris 2/4/2023 #1

单向使用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