lzlxlzy 2024-06-18 16:43 采纳率: 0%
浏览 5

pandas两个表的匹配

pandas 两个表列内容字符串包含关系的匹配 如数据1

AB列
abc        第一
qwer       第二
ones       第三
hello      第四

数据2

CDx       abcdef
  y       onesyyy
  z       hello_boy

通过数据1和数据2的匹配,得到数据3

CD列            新列
  x      abcdef           第一
  y      onesyyy          第三
  z      hello_boy        第四

请求C友解答,谢谢!

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-18 16:43
    关注

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,我们可以使用pandas库中的str.contains方法来检查一个DataFrame的某一列是否包含另一个DataFrame某列中的子串。具体步骤如下:

    1. 首先,导入必要的库并创建两个DataFrame,分别对应数据1和数据2。
    2. 然后,遍历数据2的每一行,检查D列中的每个元素是否包含在数据1的A列B列中的任何一个元素。
    3. 如果找到匹配,将相应的值添加到新列中。
    4. 最后,输出结果。

    以下是具体的Python代码实现:

    import pandas as pd
    
    # 创建数据1的DataFrame
    df1 = pd.DataFrame({
        'A列': ['abc', 'qwer', 'ones', 'hello'],
        'B列': ['第一', '第二', '第三', '第四']
    })
    
    # 创建数据2的DataFrame
    df2 = pd.DataFrame({
        'C列': ['x', 'y', 'z'],
        'D列': ['abcdef', 'onesyyy', 'hello_boy']
    })
    
    # 创建一个新的列用于存储匹配结果
    df2['新列'] = None
    
    # 遍历数据2的每一行
    for index, row in df2.iterrows():
        # 检查数据2的D列中的元素是否包含在数据1的A列中
        if any(df1['A列'].str.contains(row['D列'])):
            # 获取匹配的行
            match = df1[df1['A列'].str.contains(row['D列'])]
            df2.at[index, '新列'] = match.iloc[0]['B列']
        # 如果没有在A列中找到,检查B列
        elif any(df1['B列'].str.contains(row['D列'])):
            match = df1[df1['B列'].str.contains(row['D列'])]
            df2.at[index, '新列'] = match.iloc[0]['B列']
    
    print(df2)
    

    但是,上述代码存在一个问题:它试图直接在'B列'中查找'D列'中的子串,这可能会导致错误,因为'B列'中的值并不包含'D列'中的任何子串。正确的做法是反向查找,即在'D列'中查找'A列'和'B列'中的值。此外,为了提高效率,可以使用merge函数结合正则表达式来实现这一功能,代码如下:

    # 使用正则表达式进行模糊匹配
    df2['新列'] = df2['D列'].str.extract('({})'.format('|'.join(df1['A列'] + df1['B列'])), expand=False)
    
    # 使用merge函数进行合并
    df_result = df2.merge(df1, left_on='新列', right_on='A列', how='left')
    
    # 选择需要的列
    df_result = df_result[['C列', 'D列', 'B列']]
    df_result.rename(columns={'B列': '新列'}, inplace=True)
    
    # 处理未匹配的行
    df_result['新列'].fillna('无匹配', inplace=True)
    
    print(df_result)
    

    注意:上述代码中的df1['A列'] + df1['B列']将两个列表连接起来,然后使用正则表达式在数据2的D列中查找这些值。如果找到了匹配项,则将其对应的B列值放入新列中。如果未找到匹配项,则新列中的值将为NaN。最后,我们使用fillna函数将未匹配的行填充为“无匹配”。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月18日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错