在Pandas DataFrame的列表中高效查找关联值的方法问询
在Pandas DataFrame中高效搜索列表元素的方法
你的核心需求是在PLACES_DETECTED列的列表中定位特定元素(如A14),并获取PLACE_VALUES列中对应的数值。直接用df.loc[df['PLACES_DETECTED'] == 'A14']无效,是因为该列存储的是列表而非单个元素,无法直接做等值匹配。以下是几种高效的解决方案:
方法1:展开DataFrame(推荐,Pandas原生优化)
将两个列的列表同时展开,让每个元素对应单独一行,之后即可用常规的矢量化筛选操作,效率远高于循环。
代码示例:
import pandas as pd # 构造示例数据 data = { "PLACES_DETECTED": [["A14", "A09", "A08", "A15", "A03"], ["B10", "B19", "A18", "A03", "A14"]], "PLACE_VALUES": [[-0.0369, -0.0065, 0.01, -0.0295, -0.0402], [-0.0641, 0.0419, -0.0196, 0.0747, -0.0]] } df = pd.DataFrame(data) # 同时展开两个列表列,保持元素对应关系 expanded_df = df.explode(["PLACES_DETECTED", "PLACE_VALUES"], ignore_index=True) # 筛选目标元素并获取对应值 target = "A14" result = expanded_df.loc[expanded_df["PLACES_DETECTED"] == target, "PLACE_VALUES"].tolist() print(result) # 输出: [-0.0369, -0.0]
方法2:矢量化匹配(保留原DataFrame结构)
如果不需要修改原数据结构,可以用apply逐行处理,找到目标元素的索引并返回对应值,注意处理元素不存在的情况:
代码示例:
target = "A14" def get_matching_value(row): if target in row["PLACES_DETECTED"]: idx = row["PLACES_DETECTED"].index(target) return row["PLACE_VALUES"][idx] return None # 应用函数并过滤空值 result = df.apply(get_matching_value, axis=1).dropna().tolist() print(result) # 输出: [-0.0369, -0.0]
方法3:提前构建映射字典(适合频繁查询)
若需要多次查询不同元素,可提前构建所有元素与对应值的映射字典,后续查询直接取值,效率最高:
代码示例:
# 构建全局映射字典 place_value_map = {} for places, values in zip(df["PLACES_DETECTED"], df["PLACE_VALUES"]): for p, v in zip(places, values): place_value_map[p] = place_value_map.get(p, []) + [v] # 查询目标元素 print(place_value_map.get("A14", [])) # 输出: [-0.0369, -0.0]
内容的提问来源于stack exchange,提问作者John Cres
相关产品推荐
相关产品推荐

