You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过查找表为DataFrame新增列并插入对应值

解决笛卡尔积DataFrame添加Camelot和声距离列时程序无响应的问题

场景说明

我有两个DataFrame:

  • 一个是笛卡尔积连接表(ct_df,约1万行),包含track_x、Energy_x、Camelot_x、BPM_x等字段,每条记录关联其他所有曲目
  • 另一个是Camelot和声距离查找表(distance_df),索引和列均为Camelot标识(如10A、4B),值为整数类型的距离值

原代码问题

原本尝试用lookup结合apply为ct_df新增Harmonic Distance列,但程序无响应,代码如下:

def harmonic_distance_lookup(x, y):
    value = distance_df.lookup(x, y)
    return value

ct_df["Harmonic Distance"] = ct_df.apply(harmonic_distance_lookup(ct_df["Camelot_x"], ct_df["Camelot_y"]), axis=1)

问题根源:

  1. apply调用逻辑错误:直接传入了函数执行结果而非可调用函数,导致函数先全局执行而非逐行处理数据
  2. lookup的使用方式不符合当前场景,引发无效计算导致程序卡死

可行解决方案

将lookup替换为at(用于快速定位单个元素),并修正apply的调用方式,逐行传入Camelot_x和Camelot_y的值:

def harmonic_distance_lookup(x, y):
    value = distance_df.at[x, y]
    return value

ct_df["Harmonic Distance"] = ct_df.apply(lambda x: harmonic_distance_lookup(x["Camelot_x"], x["Camelot_y"]), axis=1)
ct_df

更高效的优化方案(可选)

对于1万行的数据,逐行apply虽然可行,但可以通过构建映射字典进一步提升效率,避免重复的DataFrame索引查找:

# 将距离表转为{(Camelot_x, Camelot_y): 距离值}的字典
distance_mapping = distance_df.stack().to_dict()

# 批量映射获取和声距离
ct_df["Harmonic Distance"] = ct_df.apply(
    lambda row: distance_mapping[(row["Camelot_x"], row["Camelot_y"])],
    axis=1
)

内容的提问来源于stack exchange,提问作者BiGubbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:27:31