【问题标题】:Vlookup in Pandas - Join or Merge?Pandas 中的 Vlookup - 加入还是合并?
【发布时间】:2019-11-04 14:10:00
【问题描述】:

我正在尝试使用 pandas 复制 Vlookup Excel 函数。我使用了 Join 和 Merge,这两种方法都给出了错误的结果。

Df1 有 15 列,包含整数和文本值,而 Df2 有 6 列,主要包含文本。

我正在尝试使用列标签“创建者”将用户详细信息从 Df2 带入 Df1。

Df1 看起来像这样:

 CA#   CreatedBy  $
9xxx12  User 1      10
9xxx13  User 2      20
9xxx14  User 3      25

Df2 看起来像这样:

CreatedBy     Role
User 1         Sales
User 2         Maintenance
User 3         Operations

我的预期结果是: DfMerged

CA#     CreatedBy  $   User Role
9xxx12  User 1      10  Sales
9xxx13  User 2      20  Maintenance
9xxx14  User 3      25  Operations

我尝试了以下代码变体,但当 Df2 中有匹配的数据时,它们与所有用户 ID 不匹配,在 Df1 中留下一些空白。

   merged= data_fr1.merge(data_fr2, on=['Created By'], how='left')

   merged2= pd.merge(data_fr1, data_fr2, left_on='Created By', 
   right_on='Created By', how='left')

有人指向此帖子寻求答案:Pandas Merging 101

但我仍然没有得到正确的结果。没有为 Df1 中的所有用户填充“CreatedBy”字段。该字段是文本和数字的混合,例如:User1、User2 等。我想知道数据类型是否干扰了结果。

【问题讨论】:

  • 我阅读了这篇文章并尝试了一些解决方案,最接近我的问题的解决方案涉及使用 pd.merge(df2, on='key', how='left') 但我仍然看到错误.

标签: python pandas dataframe


【解决方案1】:

这不会让你得到你想要做的合并吗?我不确定为什么您的角色和用户下的所有内容都为空列,但您可以重命名列。

print('df')
print(df)
print('df2')
print(df2)
print('out_df')
print(out_df)

df.merge(df2[['By', 'Role']], on='By')
df
      CA# Created  By   $
0  9xxx12    User   1  10
1  9xxx13    User   2  20
2  9xxx14    User   3  25
df2
  Created  By         Role
0    User   1        Sales
1    User   2  Maintenance
2    User   3   Operations
out_df
      CA# Created  By   $         User  Role
0  9xxx12    User   1  10        Sales   NaN
1  9xxx13    User   2  20  Maintenance   NaN
2  9xxx14    User   3  25   Operations   NaN
Out[40]: 
      CA# Created  By   $         Role
0  9xxx12    User   1  10        Sales
1  9xxx13    User   2  20  Maintenance
2  9xxx14    User   3  25   Operations

编辑:抱歉,有些问题是剪贴板解析。逻辑适用。如果您仍有问题,能否提供未正确连接的“线”示例?

【讨论】:

  • 我尝试了代码,但它复制了记录。我的 Df1 有大约 3,207 条记录,您共享的代码生成的文件为我提供了超过 52k 条记录的输出。
  • 所以在 excel 中,vlookup 取第一个匹配项。在熊猫中,您要加入 2 张桌子。你所拥有的是笛卡尔连接。这是您将结果相乘的地方,因为您有同一用户的许多实例或记录。因此,如果您有 2 个“用户 1”并且合并,您将获得 4 条记录而不是 2 条,因为它是 2*2,而不是 2。如果您可以尝试区分,则添加另一列以加入,添加条件,或者如果可以的话,加入一个独特的价值。
  • 当我使用此代码时:merge= data_fr1.merge(data_fr2, on=['Created By'], how='left') 记录不会复制,但有一些 CreatedBy 用户不填充的 ID。确实填充的那些是正确的。 CreatedBy键是字符串和文本的组合,例如:User1、User2等。不知道是不是数据类型造成了问题。
  • 它们没有填充的原因是因为左侧不存在“右侧”。试试 how = 'outer' 你会从连接的两个“边”得到所有结果。如果您担心类型,请先尝试使用 df['colname'] = df['colname'].apply(str) 转换整个列
  • 更新:我没有意识到其中一个数据帧上的用户 ID 是大写的,它不在第二个数据帧上。我使用大写函数来同质化数据并且它起作用了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2018-02-15
  • 2011-07-15
  • 1970-01-01
  • 2012-07-23
  • 2021-12-22
相关资源
最近更新 更多