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)完全符合预期,但列维度对齐失败直接导致赋值失效。
修正方案
以下三种写法都可以得到预期结果,推荐优先使用第一种:
- 给
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
- 如果你不想修改extract参数,也可以直接取提取结果的第0列,手动把DataFrame转为Series再赋值:
df.loc[mask, 'derived_col'] = df.loc[mask, 'base_col'].str.extract(r'key=(.*)')[0]
- 也可以用
str.split实现相同的提取逻辑,天然返回Series:
df.loc[mask, 'derived_col'] = df.loc[mask, 'base_col'].str.split('key=').str[-1]
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

