我有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。 我尝试使用合并并获取相同的实体,但是需要在所有字段和值之间循环。
感谢任何帮助,谢谢!
答案 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