提问人:ghost_like 提问时间:2/4/2023 更新时间:2/4/2023 访问量:70
匹配来自另一个数据帧的唯一组 - 一对多匹配
Match unique group from another dataframe - one to many match
问:
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。
答:
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
评论