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

如何在DataFrame区间匹配值并填充至另一DataFrame?解决匹配报错

问题:基于区间匹配填充DataFrame列

需求说明

根据df1中各物流公司(Tarif)的重量区间(von到bis),匹配df2中对应公司的重量(Weight),将对应的GK值填入df2的GK列。

数据结构

df1(区间规则表)

Tarif    von    bis   GK
FedEx    0.0    1.0  G001
FedEx    1.0    2.0  G002
DHL      0.0    0.5  G001
DHL      0.5    1.0  G002
DPD      0.0    5.0  G001
DPD      5.0    10.0 G002

df2(待填充表)

初始状态:

Tarif   Weight  GK
FedEx     0.6
DHL       0.6
FedEx     0.5
DPD       7.5

期望结果:

Tarif   Weight  GK
FedEx     0.6    G001
DHL       0.6    G002
FedEx     0.5    G001
DPD       7.5    G002

尝试的代码及错误

使用循环实现时触发报错:

for i in range(len(df2)):
    df2.loc[[i]['GK'] = df1['GK'].loc[(df1['Tarif'] == df2.loc[[i]]['Tarif'])
                            & (df1['von'] <  df2[[i]]['Weight']) 
                            & (df1['bis'] >= df2[[i]]['Weight'])]

错误信息:

ValueError: Can only compare identically-labeled Series objects

问题原因及解决方案

错误原因

  1. 索引使用错误:df2.loc[[i]]返回的是DataFrame而非单个值,和df1['Tarif'](Series)比较时会因索引不匹配报错;
  2. 语法错误:df2.loc[[i]['GK']存在括号不匹配问题,正确写法应为df2.loc[i, 'GK']。

修复后的循环写法

如果坚持用循环,修正索引和语法问题即可:

for i in range(len(df2)):
    # 获取当前行的单个Tarif和Weight值
    current_tarif = df2.loc[i, 'Tarif']
    current_weight = df2.loc[i, 'Weight']
    # 匹配df1中的对应区间
    match_gk = df1[(df1['Tarif'] == current_tarif) & 
                   (df1['von'] < current_weight) & 
                   (df1['bis'] >= current_weight)]['GK'].values[0]
    # 填充到df2
    df2.loc[i, 'GK'] = match_gk

更高效的非循环写法(推荐)

循环在数据量大时效率低下,推荐以下两种方法:

方法1:使用apply

def get_matched_gk(row):
    # 匹配当前行对应的GK值
    matched = df1[(df1['Tarif'] == row['Tarif']) & 
                  (df1['von'] < row['Weight']) & 
                  (df1['bis'] >= row['Weight'])]['GK'].values[0]
    return matched

# 对df2每行执行匹配逻辑
df2['GK'] = df2.apply(get_matched_gk, axis=1)

方法2:使用merge+布尔索引

先按Tarif合并两表,再筛选符合区间的行:

# 按Tarif字段合并两个表
merged_df = df2.merge(df1, on='Tarif', how='left')
# 筛选符合重量区间的记录
filtered_df = merged_df[(merged_df['von'] < merged_df['Weight']) & 
                        (merged_df['bis'] >= merged_df['Weight'])]
# 整理回原df2的结构
df2 = filtered_df[['Tarif', 'Weight', 'GK']].reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:25:18