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

pandas loc赋值异常:掩码筛选行写入提取子串全为NaN

出错原因

pandas.Series.str.extract() 方法默认参数 expand=True,当正则表达式只有1个捕获组时,返回结果仍然是列名为0的单列DataFrame,而非一维Series。
当你使用 df.loc[mask, 'derived_col'] 执行赋值时:

  • 如果赋值右侧是DataFrame,pandas会同时对行索引+列名做双重对齐
  • 你的右侧结果列名为0,和左侧目标列名derived_col无法匹配,因此所有行都被填充为NaN
    虽然打印出的提取结果行索引(0、2)完全符合预期,但列维度对齐失败直接导致赋值失效。
修正方案

以下三种写法都可以得到预期结果,推荐优先使用第一种:

  1. 给extract传入expand=False参数,让单捕获组的提取结果直接返回Series,此时赋值仅需对齐行索引即可生效:
import pandas as pd

data = [
    {'type': 'A', 'base_col': 'key=val'},
    {'type': 'B', 'base_col': 'other_val'},
    {'type': 'A', 'base_col': 'key=val'},
    {'type': 'B', 'base_col': 'other_val'}
]

df = pd.DataFrame(data)
mask = df['type'] == 'A'
# 核心修改:加expand=False,同时用loc选列避免链式索引警告
df.loc[mask, 'derived_col'] = df.loc[mask, 'base_col'].str.extract(r'key=(.*)', expand=False)

print(df)

运行输出:

type   base_col derived_col
0    A    key=val         val
1    B  other_val         NaN
2    A    key=val         val
3    B  other_val         NaN
  1. 如果你不想修改extract参数,也可以直接取提取结果的第0列,手动把DataFrame转为Series再赋值:
df.loc[mask, 'derived_col'] = df.loc[mask, 'base_col'].str.extract(r'key=(.*)')[0]
  1. 也可以用str.split实现相同的提取逻辑,天然返回Series:
df.loc[mask, 'derived_col'] = df.loc[mask, 'base_col'].str.split('key=').str[-1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:33:24