如何在DataFrame中根据x、y值查找相邻值?
如何在DataFrame中根据x、y值查找相邻值?
我明白你现在的需求啦——给带x、y坐标的DataFrame每个位置找出相邻的value,最多保留3个,而且之前用循环的方法不仅没覆盖所有相邻情况,大数据集还跑起来特别慢对吧?我来给你分享一个高效的实现方式~
首先先明确你的邻接逻辑:每个位置的相邻是上下左右四个方向的有效坐标(超出x/y范围的坐标不算),然后把这些坐标对应的value取出来,最多保留3个,不足的补NA,和你给出的示例结果完全匹配。
实现步骤
1. 先准备示例数据(和你给出的一致)
import pandas as pd data = { 'x': [0,1,2,3,0,1,2,3], 'y': [0,0,0,0,1,1,1,1], 'value': ['red','pink','green','blue','yellow','orange','blue','purple'] } df = pd.DataFrame(data)
2. 构建坐标到value的映射字典
用字典来存储(x,y)坐标对应的value,这样查找相邻值的速度会非常快,比反复查询DataFrame高效得多:
coord_to_value = df.set_index(['x','y'])['value'].to_dict()
3. 定义获取相邻值的函数
这个函数会根据输入的x、y,生成四个方向的相邻坐标,过滤掉不存在的坐标后取出对应的value,最后补全到3个元素(不足的用NA填充):
def get_adjacent_values(x, y): # 定义四个方向的相邻坐标,顺序可以根据你的需求调整 adjacent_coords = [(x+1, y), (x-1, y), (x, y+1), (x, y-1)] # 过滤掉不在原始数据中的坐标,取出对应的value adjacent_vals = [coord_to_value[coord] for coord in adjacent_coords if coord in coord_to_value] # 最多保留3个值,不足的补NA return adjacent_vals + [pd.NA]*(3 - len(adjacent_vals))
4. 应用函数生成相邻值列
用apply把函数应用到每一行,直接生成三个相邻值列:
df[['adjacent_1', 'adjacent_2', 'adjacent_3']] = df.apply( lambda row: get_adjacent_values(row['x'], row['y']), axis=1, result_type='expand' )
最终结果
运行后打印df,就会得到你想要的输出:
x y value adjacent_1 adjacent_2 adjacent_3 0 0 0 red pink yellow <NA> 1 1 0 pink red green orange 2 2 0 green pink blue blue 3 3 0 blue purple green <NA> 4 0 1 yellow red orange <NA> 5 1 1 orange yellow pink blue 6 2 1 blue orange green purple 7 3 1 purple blue blue <NA>
为什么这个方法比你原来的循环好?
- 覆盖所有相邻情况:原来的循环只处理了
x-1的情况,完全没考虑x+1、y+1、y-1这些方向的相邻值,结果不全。 - 效率大幅提升:用字典查找+
apply的方式,比你原来循环修改iloc的方式高效太多,大数据集下差异会非常明显(循环赋值在pandas里是非常不推荐的操作)。 - 灵活性高:如果需要调整相邻坐标的优先级(比如先看上下再看左右),只要修改
adjacent_coords里的坐标顺序就行。
备注:内容来源于stack exchange,提问作者SMar3552
相关产品推荐
相关产品推荐

