当df2.Key是df1.Key的子串时,如何将df2.Length设为df1对应值?
问题解决:DataFrame子串匹配赋值
原代码的问题
你的代码存在两个核心问题:
df1.Key.str.extract(r'(.+?(?=\.))')返回的是DataFrame类型,而isin()需要传入一维序列(比如Series),导致匹配逻辑直接失效;- 即使转成一维序列,
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的结果:
| Key | Length |
|---|---|
| OK340820 | 50000 |
| OK340821 | 67000 |
内容的提问来源于stack exchange,提问作者skiventist
相关产品推荐
相关产品推荐

