如何在数据框中查找值并使用 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 -> colB
在 df1
中不是唯一的,即对于 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_")
我有 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 -> colB
在 df1
中不是唯一的,即对于 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_")