如何通过查找表为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)
问题根源:
apply调用逻辑错误:直接传入了函数执行结果而非可调用函数,导致函数先全局执行而非逐行处理数据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
相关产品推荐
相关产品推荐

