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

Pandas将df1中的一列与df2中的多列进行比较

  •  0
  • theMerakist  · 技术社区  · 4 年前

    我有两个df。

    df1记录了用户执行的操作,df2记录了用户拥有的操作。将特定动作字段与其各自的所有者字段进行比较,并用布尔值标记。这可以在不为每个字段和用户操作使用循环的情况下完成吗。请帮帮我!!

    df1=

     owner    field           value
    0   Rick      cin          234011
    1  Daryl    email  test@gmail.com
    2  Negan    phone         9087654
    3  Carol  address         Hilltop
    

    df2=

       owner      cin             email    phone     address
    0   Rick   543216  test@hotmail.com  9654356  Alexandria
    1  Daryl   675432    test@gmail.com  9876590     kingdom
    2  Negan   234123    test@yahoo.com  9087654  Ocean side
    3  Carol  0987809   test2@gmail.com  9076535     Atlanta
    

    预期结果=

    owner      field    value           Flag
    0   Rick    cin     234011          False
    1   Daryl   email   test@gmail.com  True
    2   Negan   phone   9087654         True
    3   Carol   address Hilltop         False
    

    由于Daryl和Negan拥有这些实体,我们将其标记为真。 我尝试过使用merge并获取相同的实体,但它需要在所有字段和值之间循环。

    任何帮助都不胜感激,谢谢!

    0 回复  |  直到 4 年前
        1
  •  3
  •   sammywemmy    4 年前

    熔融df1:

        df1_melt = (
        df1.melt(["owner", "field"])
        .drop("variable", 1)
        .rename(columns={"field": "variable"})
    )
    df1_melt
    
    owner   variable    value
    0   Rick    cin 234011
    1   Daryl   email   test@gmail.com
    2   Negan   phone   9087654
    3   Carol   address Hilltop
    

    熔化df2,与df1_Melt合并,最后重命名Flag中的值并将其更改为True/False:

        (
        df2.melt("owner")
        .astype(str)
        .merge(df1_melt, how="right", indicator=True)
        .rename(columns={"_merge": "Flag"})
        .assign(Flag=lambda x: np.where(x.Flag == "both", True, False))
    )
    
    
    
       owner    variable    value           Flag
    0   Rick    cin       234011            False
    1   Daryl   email     test@gmail.com    True
    2   Negan   phone     9087654           True
    3   Carol   address   Hilltop           False