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

基于dist_rank从额外DataFrame提取字段至原DataFrame的问题

解决DataFrame按index和dist_rank匹配字段并新增列的问题

看起来你是想把额外DataFrame里,对应主DataFrame每一行、且dist_rank为1的字段匹配到主表中对吧?你的代码只在最后一行得到有效值,其他都是NaN,核心问题是索引不匹配,我来给你拆解清楚并提供正确的实现方式:

先明确你的数据和需求

主DataFrame(df)

x_1  x_2
0  0.0  0.0
1  1.0  0.0
2  2.0  0.2
3  2.5  1.5
4  1.5  2.0
5 -2.0 -2.0

额外DataFrame(result)

index  x_1_x  x_2_x  x_1_y  x_2_y  value      dist  dist_rank
0       0    0.0    0.0    0.1    0.1    5.0  0.141421        2.0
4       0    0.0    0.0    1.5    1.0   -2.0  1.802776        3.0
5       0    0.0    0.0    0.0    0.0    3.0  0.000000        1.0
9       1    1.0    0.0    0.1    0.1    5.0  0.905539        1.0
11      1    1.0    0.0    2.0    0.4    3.0  1.077033        3.0
14      1    1.0    0.0    0.0    0.0    3.0  1.000000        2.0
18      2    2.0    0.2    0.1    0.1    5.0  1.902630        3.0
20      2    2.0    0.2    2.0    0.4    3.0  0.200000        1.0
22      2    2.0    0.2    1.5    1.0   -2.0  0.943398        2.0
29      3    2.5    1.5    2.0    0.4    3.0  1.208305        3.0
30      3    2.5    1.5    2.5    2.5    4.0  1.000000        1.0
31      3    2.5    1.5    1.5    1.0   -2.0  1.118034        2.0
38      4    1.5    2.0    2.0    0.4    3.0  1.676305        3.0
39      4    1.5    2.0    2.5    2.5    4.0  1.118034        2.0
40      4    1.5    2.0    1.5    1.0   -2.0  1.000000        1.0
45      5   -2.0   -2.0    0.1    0.1    5.0  2.969848        2.0
46      5   -2.0   -2.0    1.0   -2.0    6.0  3.000000        3.0
50      5   -2.0   -2.0    0.0    0.0    3.0  2.828427        1.0

需求:根据result中的index列(对应df的行索引)和dist_rank == 1.0的条件,提取x_1_y、x_2_y、value字段到df中,新增对应列。

你的代码为什么只最后一行有值?

你写的这两行代码:

df['value_dist_rank1']=result.loc[result['dist_rank']==1.0, 'value']
df['value_dist_rank1 ']=result[result['dist_rank']==1.0]['value']

本质是把result中筛选后的value列直接赋值给df的新列。但筛选后的result行保留了原表的索引(比如5、9、20、30、40、50),而df的索引是0-5,只有当两个表的索引完全重合时(也就是result索引50对应df索引5),值才能匹配上,其他行自然就显示NaN了。

正确的实现方法

这里提供两种常用的解法,你可以根据自己的习惯选择:

方法1:用merge合并(直观可控)

这种方式明确指定匹配的键,适合一次性合并多个字段:

# 第一步:筛选出dist_rank为1的行,只保留需要的匹配键和目标字段
rank1_data = result[result['dist_rank'] == 1.0][['index', 'x_1_y', 'x_2_y', 'value']]

# 第二步:将筛选后的数据和df合并,用df的索引匹配rank1_data的index列
df = df.merge(rank1_data, left_index=True, right_on='index', how='left')

# 可选:重命名列名,让含义更清晰
df.rename(columns={
    'value': 'value_dist_rank1',
    'x_1_y': 'x_1_y_rank1',
    'x_2_y': 'x_2_y_rank1'
}, inplace=True)

方法2:设置索引后映射(简洁高效)

如果不想改变df的原有结构,也可以调整筛选后数据的索引,直接通过索引匹配赋值:

# 第一步:筛选dist_rank为1的行,并把index列设置为新索引
rank1_data = result[result['dist_rank'] == 1.0].set_index('index')

# 第二步:直接为df新增列,通过索引自动匹配
df['value_dist_rank1'] = rank1_data['value']
df['x_1_y_rank1'] = rank1_data['x_1_y']
df['x_2_y_rank1'] = rank1_data['x_2_y']

最终结果

执行上述任一方法后,你会得到预期的结果:

x_1  x_2  value_dist_rank1  x_1_y_rank1  x_2_y_rank1
0  0.0  0.0                3.0          0.0          0.0
1  1.0  0.0                5.0          0.1          0.1
2  2.0  0.2                3.0          2.0          0.4
3  2.5  1.5                4.0          2.5          2.5
4  1.5  2.0               -2.0          1.5          1.0
5 -2.0 -2.0                3.0          0.0          0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:22:35