代码之家  ›  专栏  ›  技术社区  ›  Asrakh

熊猫会像vlookup一样在第一场比赛中停止合并,而不是复制

  •  0
  • Asrakh  · 技术社区  · 3 年前

    我有两个表,采购订单数据和商品代码数据。一些天才决定,一些材料组码应该是相同的,因为它们在较低级别上由总账账户区分。因此,我不能在材质组上合并,因为我会得到重复的行。

    假设如下:

    import pandas as pd
    
    d1 = {'PO':[123456,654321,971358], 'matgrp': ["1001",'803A',"803B"]}
    d2 = {'matgrp':["1001", "1001", "803A", "803B"], 'commodity':['foo - 10001', 'bar - 10002', 'spam - 100003','eggs - 10003']}
    
    pos = pd.DataFrame(data=d1)
    mat_grp = pd.DataFrame(data=d2)
    
    merged = pd.merge(pos, mat_grp, how='left', on='matgrp')
    merged.head()
          PO    matgrp  commodity
    0   123456  1001    foo - 10001
    1   123456  1001    bar - 10002
    2   654321  803A    spam - 100003
    3   971358  803B    eggs - 10003
    

    如您所见,PO 123456显示了两次,因为物料组表中有多行物料1001。

    所需的行为是“合并”只合并一次,找到材质组的第一个条目,然后添加它,而不执行其他操作,比如vlookup的工作方式。长商品代码在某些情况下可能不正确(总是显示第一个),这是可以接受的不准确。

    注:虽然欢迎在本问题范围之外提出如何解决该问题的建议(例如合并总账账户,由于其他原因不可行),但假设以下情况:可用数据是SAP ME81N的采购订单列表和包含物料组/商品代码列表的Excel文件。

    1 回复  |  直到 3 年前
        1
  •  1
  •   mozway    3 年前

    熊猫的 merge 其行为(主要)类似于SQL合并,并将提供匹配键的所有组合。如果只需要第一项,只需将其从要合并的数据中删除即可。

    使用 drop_duplicates 在…上 mat_grp :

    merged = pd.merge(pos, mat_grp.drop_duplicates('matgrp'), how='left', on='matgrp')
    

    输出:

           PO matgrp      commodity
    0  123456   1001    foo - 10001
    1  654321   803A  spam - 100003
    2  971358   803B   eggs - 10003