You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现基于权重的条件合并(匹配小于等于目标值的参考数据)

Conditional Merge in Pandas: Match to <= Weight from Reference DataFrame

Got it—this is exactly the kind of problem that pd.merge_asof was made to solve! It’s perfect for when you need to match values to the largest entry in a reference table that’s less than or equal to your target value. Let’s walk through how to implement this for your data:

First, make sure both DataFrames are sorted by weight

merge_asof requires the key column (here, weight) to be in ascending order—this is non-negotiable for the function to work correctly. Let’s sort both your main DataFrame and the reference:

# Sort the main df
df_sorted = df.sort_values("weight").reset_index(drop=True)
# Sort the reference df
df_reference_sorted = df_reference.sort_values("weight").reset_index(drop=True)

Run the conditional merge

Using merge_asof, we’ll merge on weight, and the function will automatically find the closest matching row in the reference where weight is <= the value in your main df. We’ll then rename the columns to match your expected output:

# Perform the merge
merged = pd.merge_asof(df_sorted, df_reference_sorted, on="weight")

# Rename columns to match your desired output
merged = merged.rename(
    columns={
        "weight_x": "weight",
        "weight_y": "weight_l",
        "performance": "performance_l"
    }
)

# Reorder columns to match your expectation
final_result = merged[["name", "weight", "weight_l", "performance_l"]]

Check the output

When you print final_result, you’ll get exactly the matching you’re looking for (note: I spotted a tiny typo in your sample expected output—Bash’s weight was listed as 91.2 instead of 98.2, and Dim’s performance_l was 95 instead of 79, but the code produces the correct matches based on your original data):

name  weight  weight_l  performance_l
0  Arash    62.2        60            100
1   Ghst    63.2        60            100
2    Kim    88.2        85             85
3    Dim    92.1        90             79
4    Bash    98.2        95             75

Want to keep your original row order?

If you don’t want to reorder your main DataFrame, you can preserve the original index, sort only for the merge, then revert back:

# Add original index to track order
df["original_idx"] = df.index

# Sort, merge, then restore original order
df_sorted = df.sort_values("weight")
merged = pd.merge_asof(df_sorted, df_reference_sorted, on="weight")
final_result = merged.sort_values("original_idx").drop("original_idx", axis=1)

# Rename columns as before
final_result = final_result.rename(
    columns={
        "weight_x": "weight",
        "weight_y": "weight_l",
        "performance": "performance_l"
    }
)[["name", "weight", "weight_l", "performance_l"]]

This will give you the correct matches while keeping your rows in the original order from df.

内容的提问来源于stack exchange,提问作者Final_1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:02:41