基于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
相关产品推荐
相关产品推荐

