python - 从熊猫数据框中的多列中查找
问题描述
我有一个数据框(~8k 行),其中包含几列对应于要查找的固定值。
数据框看起来像这样-(ish):
班级名称 | 尺寸 | 颜色 |
---|---|---|
第一的 | 大号 | 绿色 |
第一的 | 大号 | 蓝色的 |
第二 | 特大号 | 红色的 |
查找表看起来像这样(一个 df 或一个嵌套的 python 字典):
班级名称 | 尺寸 | 蓝色的 | 红色的 | 绿色 |
---|---|---|---|---|
第一的 | 大号 | 90 | 95 | 90 |
第一的 | 特大号 | 100 | 105 | 100 |
第二 | 特大号 | 100 | 105 | 100 |
我正在寻找的是一种将新列值添加到我的第一个 df 的有效方法。像这样的东西:
班级名称 | 尺寸 | 颜色 | 价值 |
---|---|---|---|
第一的 | 大号 | 绿色 | 90 |
第一的 | 大号 | 蓝色的 | 90 |
第二 | 特大号 | 红色的 | 105 |
现在我正在解决这个问题
df['value'] = df.apply(
lambda row: lookup_function(df['class_name'], df['size'], df['colour'])
# and that lookup_function includes the dict (or a df if that helps)
def lookup_function(class_name, size, colour):
looky_here = {.. lookup table as dict structure ..}
try:
return float(looky_here[class_name][size][colour])
except:
return 0
这很慢(在处理完我的 8k df 之后,我有很多新的 8k df 要做)。我怎样才能更快更优雅地做到这一点?
解决方案
我会考虑融化(融化文档)你的查找表:
melted = lookup.melt(id_vars=['class_name', 'size'], value_vars=['blue', 'red', 'green'], var_name='colour')
此时,您可以简单地将您的第一个数据框与它合并。
df.merge(melted, on=['class_name', 'size', 'colour'])