提前谢谢你的帮助.我有两个数据帧

size=pd.DataFrame({"Min Size":[30,41,40],
                   "Max Size":[40, 60, 50],
                   "Category":['small', 'big', "medium"],
                   "Product":['Apple', 'Apple', "Peach"]})
sold=pd.DataFrame({"Purchase_date":["20/01/2020", "18/02/2020", "01/06/2020"],
                          "Size":[35, 45, 42],
                          "Category":["small","big","medium"],
                          "Product":['Apple', 'Peach', "Apple"]})

推荐答案

Pandas 的加入条件必须完全匹配.它没有SQL中的BETWEEN ... AND ...子句.

可以使用numpy广播将sold中的每一行与size中的每一行进行比较,并筛选匹配项:

# Converting everything to numpy for comparison
sold_product = sold["Product"].to_numpy()[:, None]
sold_size = sold["Size"].to_numpy()[:, None]

product, min_size, max_size = size[["Product", "Min Size", "Max Size"]].T.to_numpy()

# Compare every row in `sold` to every row in `size`.
# `mask` is a len(sold) * len(size) matrix whose value
# indicate if row i in `sold` matches row j in `size`
mask = (sold_product == product) & (min_size <= sold_size) & (sold_size <= max_size)

# For each row in `sold`, find the first row in `size` that
# is True / non-zero
idx, join_key = mask.nonzero()
sold.loc[idx, "join_key"] = join_key

# Result
sold.merge(
    size[["Category"]],
    how="left",
    left_on="join_key",
    right_index=True,
    suffixes=("_Expected", "_Actual"),
)

Python相关问答推荐

如果条件为真,则Groupby.mean()

如何将ctyles.POINTER(ctyles.c_float)转换为int?

将特定列信息移动到当前行下的新行

如何比较numPy数组中的两个图像以获取它们不同的像素

Python 约束无法解决n皇后之谜

如何让程序打印新段落上的每一行?

大小为M的第N位_计数(或人口计数)的公式

OR—Tools中CP—SAT求解器的IntVar设置值

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

如何从列表框中 Select 而不出错?

Tkinter菜单自发添加额外项目

如何在PySide/Qt QColumbnView中删除列

替换现有列名中的字符,而不创建新列

从一个df列提取单词,分配给另一个列

如何使用大量常量优化代码?

python3中np. divide(x,y)和x/y有什么区别?'

一维不匹配两个数组上的广义ufunc

替换包含Python DataFrame中的值的<;

VSCode Pylance假阳性(?)对ImportError的react

正则表达式反向查找