首页 > 解决方案 > 使用 apply 从其他表中查找数据

问题描述

假设我有一个如下所示的表:

table = pd.DataFrame(
          columns=["Name", "Size", "Color"], 
          data=[['A', 1, 'Red'], ['B', 2, 'Green'], ['C', 3, 'Blue']]
        )

还有一个如下所示的查找表:

lookup = pd.DataFrame(
           columns=["Color", "Source", "Lead Days"], 
           data=[["Red", "Europe", 2], 
                 ["Green", "Europe", 3], 
                 ["Blue", "US", 1], 
                 ["Yellow", "Europe", 2]]
         )

如何table通过从中查找“颜色”来添加“来源”和“交货期”列lookup

故事有时会有所帮助。

table有我需要订购的所有物品。

lookup有我从哪里订购它们以及需要多长时间。

我想进行转换table,以便它可以显示我需要订购的每个项目的“来源”和“交货期”。

决赛桌应该是这样的:

注意:虽然我确信有一种方法可以通过合并或顶级表操作来做到这一点。本着Minimally Sufficient Pandas的精神,为了避免 pandas 过度配置操作的巨大影响,我更愿意使用apply. Apply 很好,因为它很容易apply在所有情况下始终如一地达到。

这是我目前的方法,但会导致错误ValueError: Columns must be same length as key

对我来说,这没什么意义,因为我要返回一个长度为 2 的列表并将其放入两列。但我确信 pandas 在这里反直觉是有原因的。

lookup_columns = ["Source", "Lead Days"]
table[lookup_columns] = table.apply(
    lambda row: 
          lookup.query('`Color` == "{color}"'.format(color=row["Color"])).loc[:, lookup_columns].values[0]
      , axis = 1)

标签: pythonpandasdataframe

解决方案


使用apply,您可以:

>>> pd.concat([table, table['Color'].apply(lambda x: lookup.loc[lookup['Color'] == x, ['Source', 'Lead Days']].squeeze())], axis=1)

  Name  Size  Color  Source  Lead Days
0    A     1    Red  Europe          2
1    B     2  Green  Europe          3
2    C     3   Blue      US          1

旧答案

使用pd.merge

>>> pd.merge(table, lookup, how='left', on='Color')

  Name  Size  Color  Source  Lead Days
0    A     1    Red  Europe          2
1    B     2  Green  Europe          3
2    C     3   Blue      US          1

推荐阅读