如何在数据框中查找值并使用 python/pandas return 匹配值?

How do I look up values in a dataframe and return matching values using python/pandas?

我有 2 个大数据帧,df1 和 df2。我在 df2 中缺少一列 (colB),我想根据共享列 (colA) 中的值添加该列。如果我使用的是 Excel,我会通过标准的 vlookup 公式来执行此操作,但我正在努力使用 pandas 合并函数来获得所需的结果。

colA 和 colB 都包含多个具有相同值的条目,因此我使用这行代码创建一个仅包含唯一配对的新数据框。

df_keyvalues = df1[["colA", "colB"]].drop_duplicates()

然后我使用合并将 colB 添加到 df2

df2 = df2.merge(df_keyvalues, how = "left", on = "colA")

在上述 运行 之后,我确实在 df2 中得到了 colB,但我的数据框中也得到了比开始时更多的行。

我做错了什么?

我希望能够在 df1[“colA”] 中查找 df2[“colA”] 中的值,并且 return 在 df1[“colB”] 中查找值。如果 df2[“colA”] 和 df1[“colA”] 中的值不完全匹配,则将 df2[“colB”] 中的值留空并继续下一个。

提前致谢。

如果您在合并后获得更多行,这意味着 colA 不是 df_keyvalues 的唯一键。这反过来意味着映射 colA -> colBdf1 中不是唯一的,即对于 colA 的至少一个值,存在 colB.

的多个值

您需要先从 df1 创建唯一映射 colA -> colB。一种方法是:

# take the smallest value if A->B mapping is not unique
df_AtoB = df1.groupby("colA", as_index=False).agg(colB_=("colB", "min"))

上述去重的“正确”方法究竟是什么取决于您的用例。

之后可以在df2中填写colB如下

df = df2.merge(df_AtoB, on="colA", how="left")
df.colB = df.colB.fillna(df.colB_)
df = df.drop(columns="colB_")