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

使用loc/iloc为DataFrame赋值行子集时出现NaN问题排查

DataFrame使用.loc/.iloc更新行子集列时出现NaN的原因与解决办法

问题场景

当尝试用.loc(或.iloc)更新DataFrame某行的子集列时,目标行被填充为NaN,但直接赋值单个值时操作正常。

示例代码

import pandas as pd

a = pd.DataFrame({'id': [1, 2, 10, 12],
     'val1': ['a', 'b', 'c', 'd'],
     'val2': ['e', 'f', 'g', 'h']})

my_row = pd.DataFrame({'id': [7],
     'val1': ['z']})

index = a[a.id == 2].index

a.loc[index, ['id','val1']] = my_row

你也尝试过.iloc的写法:

a.iloc[index, Y_index] = row

其中Y_index是['id','val1']对应的列索引,my_row是包含目标列新内容的DataFrame。两种方式均无报错,但目标行被填充为NaN。

关键观察

当将索引改为index = a[a.id == 1].index时,赋值操作成功。此时my_row与a.loc[index, ['id','val1']]的索引完全一致,但你不清楚背后的原因和通用解决办法。

原因解析

问题核心是pandas的赋值逻辑基于索引对齐:

  • my_row的默认行索引是[0],而a中id==2的行对应的索引是[1](原DataFramea的行索引为0、1、2、3)。
  • 用DataFrame赋值时,pandas会严格匹配两边的索引与列,my_row的索引0在目标位置(索引1)找不到匹配项,因此填充NaN。
  • 当选取id==1的行时,目标索引是[0],与my_row的索引完全匹配,对齐成功,赋值正常。

解决办法

以下几种方式可避免索引对齐导致的NaN:

  1. 提取my_row的.values属性赋值,跳过索引对齐逻辑:
a.loc[index, ['id','val1']] = my_row.values
  1. 将my_row的索引重置为与目标行一致:
my_row.index = index
a.loc[index, ['id','val1']] = my_row
  1. 取出my_row的单行数据转为Series赋值:
a.loc[index, ['id','val1']] = my_row.iloc[0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:51:20