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

当df2.Key是df1.Key的子串时,如何将df2.Length设为df1对应值?

问题解决:DataFrame子串匹配赋值

原代码的问题

你的代码存在两个核心问题:

  1. df1.Key.str.extract(r'(.+?(?=\.))')返回的是DataFrame类型,而isin()需要传入一维序列(比如Series),导致匹配逻辑直接失效;
  2. 即使转成一维序列,np.where中直接使用df1.Length是把整个Series作为值,无法针对df2的每一行匹配到df1中对应的Length值,因为没有建立行级的关联映射。

正确解决方案

方法一:构建映射字典(简洁高效)

先从df1的Key中提取不带后缀的前缀,构建「前缀-Length」的映射字典,再通过df2的Key直接映射赋值:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Key':['OK340820.1','OK340821.1'],'Length':[50000,67000]})
df2 = pd.DataFrame({'Key':['OK340820','OK340821'],'Length':[np.nan,np.nan]})

# 提取df1 Key的前缀(去掉.及后面的内容),构建映射字典
key_length_map = df1['Key'].str.split('.').str[0].to_frame().join(df1['Length']).set_index('Key')['Length'].to_dict()

# 给df2赋值
df2['Length'] = df2['Key'].map(key_length_map)

方法二:使用Merge合并(适合复杂匹配场景)

如果后续有更复杂的匹配需求,用合并的方式更灵活:

# 处理df1,生成前缀列
df1_with_prefix = df1.assign(key_prefix=df1['Key'].str.extract(r'(.+?(?=\.))')[0])

# 合并df2和处理后的df1,匹配前缀并赋值
df2 = df2.merge(
    df1_with_prefix[['key_prefix', 'Length']],
    left_on='Key',
    right_on='key_prefix',
    how='left'
).drop(columns=['key_prefix']).rename(columns={'Length_y': 'Length'})

执行后df2的结果:

KeyLength
OK34082050000
OK34082167000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:16:15