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

合并/映射DataFrame时返回NaN而非目标值的问题排查

问题描述

现有两个DataFrame df 和 df1,需要将df1中的af、power、fr三列,依据df的Range列与df1的Sy列匹配后添加到df中。尝试使用map方法(df['TotalMax'] = df['Range'].map(df1.set_index('Sy')['af']))和merge方法后,新生成的列全部返回NaN值。需求如下:

  • 当Range为多值范围格式(如700-800)时,对应匹配列返回NaN
  • Range值需支持对应不同Filter重复匹配
解决方案

1. 排查并统一数据格式

出现全NaN的核心原因几乎都是df['Range']与df1['Sy']的数据类型/格式不匹配(比如一个是字符串、一个是数值;或字符串带空格/多余符号)。先做格式清理与类型统一:

import pandas as pd

# 清理df的Range列:标记范围值,提取单值并转成数值类型
df['is_range'] = df['Range'].str.contains('-')
# 去除字符串可能带的空格
df['Range'] = df['Range'].str.strip()
# 提取非范围的单值,转为数值(假设df1['Sy']是数值类型)
df['Range_clean'] = pd.to_numeric(df.loc[~df['is_range'], 'Range'], errors='coerce')
# 范围值对应的Range_clean设为缺失值
df.loc[df['is_range'], 'Range_clean'] = pd.NA

# 统一df1的Sy列类型,和Range_clean保持一致
df1['Sy'] = pd.to_numeric(df1['Sy'], errors='coerce')

2. 左连接完成匹配

用左连接保留df的所有行,同时匹配df1的目标列,范围值会自动返回NaN:

# 只取df1中需要匹配的列
match_cols = df1[['Sy', 'af', 'power', 'fr']]
# 左连接,基于清理后的Range_clean和Sy匹配
result_df = df.merge(match_cols, left_on='Range_clean', right_on='Sy', how='left')

3. 清理临时列(可选)

如果不需要中间生成的临时列,直接删除即可:

result_df = result_df.drop(columns=['is_range', 'Range_clean', 'Sy'])

额外注意事项

  • 如果df1中Sy存在重复值,merge后会出现重复行,可提前去重:df1 = df1.drop_duplicates(subset='Sy')
  • 若Range的单值格式特殊(如带单位),需要先做字符串提取(比如用str.extract(r'(\d+)')提取数字部分)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:25:00