我有一个数据框(约 8k 行),其中包含几列对应于要查找的固定值。
数据框看起来像这样-(ish):
class_name | 尺寸 | 颜色 |
---|---|---|
第一次 | L | 绿色 |
第一次 | L | 蓝色 |
第二个 | XL | 红色 |
查找表如下所示(df 或嵌套的 python 字典):
class_name | 尺寸 | 蓝色 | 红色 | 绿色 |
---|---|---|---|---|
第一次 | L | 90 | 95 | 90 |
第一次 | XL | 100 | 105 | 100 |
第二个 | XL | 100 | 105 | 100 |
我正在寻找的是一种将新列 value 添加到我的第一个 df 的有效方法。像这样:
class_name | 尺寸 | 颜色 | 价值 |
---|---|---|---|
第一次 | L | 绿色 | 90 |
第一次 | L | 蓝色 | 90 |
第二个 | XL | 红色 | 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 要做)。我怎样才能更快更优雅地做到这一点?
答案 0 :(得分:1)
我会考虑融化 (melt documentation) 您的查找表:
melted = lookup.melt(id_vars=['class_name', 'size'], value_vars=['blue', 'red', 'green'], var_name='colour')
此时您可以简单地将第一个数据框与其合并。
df.merge(melted, on=['class_name', 'size', 'colour'])