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

基于字符串特定位置切片匹配合并Pandas DataFrame的代码优化请求

解决Pandas DataFrame按特定字符串位置匹配合并的问题

先看你的需求:有两个DataFrame,要找出df1中字符串的第2、3位和df2中字符串的第1、2位匹配的记录,然后合并这部分匹配的行。你给出的示例里'01A01'和'1A1'是匹配的——前者第2、3位是'1A',后者第1、2位也是'1A'。

你的代码思路是对的,但有几个小问题,而且用循环处理Pandas数据效率不高,我帮你优化一下:

原代码的问题点

  • df1['new1'] = full_list2 这里赋值错误,应该是full_list1
  • merge时left_on=new1和right_on=new2应该传入字符串列名(比如left_on='new1'),不然会报错找不到变量
  • 判断结果是否为空不能直接用if df_new,Pandas DataFrame在布尔判断里会抛出警告,正确做法是用df_new.empty
  • 循环遍历每行数据效率很低,Pandas本身支持矢量化字符串操作,比循环快得多

优化后的解决方案

直接用Pandas的字符串矢量化操作提取匹配键,然后合并,代码更简洁高效:

import pandas as pd

# 示例数据
data1 = {'Column': ['01A01', '03C12', '04F23']}
df1 = pd.DataFrame(data1)
data2 = {'Plate': ['1A1', '3D14', '1B6']}
df2 = pd.DataFrame(data2)

def letter_matcher(df1, df2, left_key, right_key):
    # 提取df1中字符串的第2、3位(索引1到3,左闭右开)
    df1['match_key'] = df1[left_key].str[1:3]
    # 提取df2中字符串的第1、2位(前两位,索引0到2)
    df2['match_key'] = df2[right_key].str[:2]
    
    # 按匹配键内连接合并,只保留两边都匹配的行
    df_new = df1.merge(df2, on='match_key', how='inner')
    
    # 处理结果输出
    if not df_new.empty:
        print(df_new.head())
        # 如果不需要保留match_key列,可以删掉
        # df_new = df_new.drop('match_key', axis=1)
        return df_new
    else:
        print('No result')
        return None

# 调用函数
result = letter_matcher(df1, df2, left_key='Column', right_key='Plate')

代码解释

  1. 矢量化字符串操作:str[1:3]直接对整个Series的每个字符串切片,取出第2、3位;str[:2]取出前两位,比循环遍历每行快很多,尤其是数据量大的时候
  2. 合并逻辑:用merge的on参数指定共同的匹配键,how='inner'只保留两边都匹配的行,正好符合你的需求
  3. 空结果判断:用df_new.empty来检查是否有匹配结果,避免Pandas的布尔判断警告

运行这段代码后,你会得到预期的匹配结果:

Column match_key Plate
0  01A01        1A   1A1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:27:38