python - 使用 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)
解决方案
使用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
推荐阅读
- c# - 如何在没有编码问题的情况下将 DataTable 转换为 CSV
- ruby - Rails 5.2 ActionController::UnknownFormat in PatientController#index 错误
- curl - 如何将 cURL 命令导入 POSTMAN
- reactjs - 从输入值创建 svg 路径
- syslog-ng - 在 syslog-ng.conf 中添加过滤器
- java - @Before 和@BeforeClass 的意义何在?
- c++ - 在另一个文件中初始化的外部数组中的未定义引用
- python - 如何在pyspark(或python)中将csv文件导入mongodb?
- python - 在 Python 中处理列表的列表
- delphi - Graphics32 的 TImgView32 中的滚动条损坏