繁体   English   中英

如何在 dataframe 中查找值并使用 python/pandas 返回匹配值?

[英]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 合并 function 来获得所需的结果。

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

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

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

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

运行上述内容后,我确实在 df2 中获得了 colB,但在我的 dataframe 中我也获得了更多行。

我究竟做错了什么?

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

提前致谢。

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

您需要首先从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_") 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM