【问题标题】:Python - function similar to VLOOKUP (Excel)Python - 类似于 VLOOKUP (Excel) 的功能
【发布时间】:2017-05-21 13:43:51
【问题描述】:

我正在尝试加入两个数据框,但无法理解 Python 提供的可能性。

第一个数据帧:

ID MODEL   REQUESTS ORDERS
1  Golf    123      4
2  Passat  34       5
3  Model 3 500      8
4  M3      5        0

第二个数据框:

MODEL   TYPE  MAKE
Golf    Sedan Volkswagen
M3      Coupe BMW
Model 3 Sedan Tesla

我想要的是在第一个名为“make”的数据框中添加另一列,使其看起来像这样:

ID MODEL   MAKE       REQUESTS ORDERS
1  Golf    Volkswagen 123      4
2  Passat  Volkswagen 34       5
3  Model 3 Tesla      500      8
4  M3      BMW        5        0

我已经查看了合并、连接和映射,但所有示例都只是在数据框的末尾附加了所需的信息。

【问题讨论】:

  • 第二个数据框中的帕萨特在哪里?
  • 不应该合并这样做吗?
  • 问题是关于插入的,所以重新打开

标签: python pandas dataframe vlookup


【解决方案1】:

我认为您可以将Series 与Series 使用df2 创建的insert 一起使用(如果df2 中MODEL 列中的某些值丢失,请获取NaN):

df1.insert(2, 'MAKE', df1['MODEL'].map(df2.set_index('MODEL')['MAKE']))
print (df1)
   ID    MODEL        MAKE  REQUESTS  ORDERS
0   1     Golf  Volkswagen       123       4
1   2   Passat         NaN        34       5
2   3  Model 3       Tesla       500       8
3   4       M3         BMW         5       0

【讨论】:

  • 谢谢@jezrael。已经考虑过 insert() 并且刚刚看到您的编辑。
  • @jezrael:非常感谢
  • @jezrael:一个很酷的解决方案。如果我在 df1 中没有唯一值,但它们被重复了,我该怎么办?因为在那种情况下我得到一个错误:“重新索引仅对具有唯一值的索引对象有效”。
  • @TomaszPrzemski - 然后应该使用合并计数器,检查this
【解决方案2】:

虽然在这种情况下不是这样,但在某些情况下 df2 有两个以上的列,您只想根据特定列将其中的一列添加到 df1 作为键。这是一个您可能会觉得有用的通用代码。

df = pd.merge(df1, df2[['MODEL', 'MAKE']], on = 'MODEL', how = 'left')

【讨论】:

  • 请将代码格式化为代码。 stackoverflow.com/help/formatting 要么使用`,要么缩进4个空格,或者标记你的文本并按ctrl+K。此外,理想情况下,您应该解释一下是什么让您的答案比其他人好/更好
【解决方案3】:

join 方法的作用与 VLOOKUP 非常相似。它将第一个数据帧中的列与第二个数据帧的索引连接起来,因此您必须将MODEL 设置为第二个数据帧中的索引,并且只获取MAKE 列。

df.join(df1.set_index('MODEL')['MAKE'], on='MODEL')

看看documentation for join,它实际上使用了 VLOOKUP 这个词。

【讨论】:

  • 谢谢@Ted Petrou。我看到文档中实际上有 vlookup。我只是错过了使用 ().set_index 方法。
【解决方案4】:

我总是发现合并是一种简单的方法:

df1.merge(df2[['MODEL', 'MAKE']], how = 'left')

但是,我必须承认,如果您想将新列命名为“MAKE”以外的其他名称,它就不会那么简短和好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多