如何在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
问题原因及解决方案
错误原因
- 索引使用错误:
df2.loc[[i]]返回的是DataFrame而非单个值,和df1['Tarif'](Series)比较时会因索引不匹配报错; - 语法错误:
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
相关产品推荐
相关产品推荐

