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

时间:2020-10-07 04:34:58

标签: python pandas

我有2 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拥有这些实体,因此我们将其标记为true。 我尝试使用合并并获取相同的实体,但是需要在所有字段和值之间循环。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

融化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