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

如何在Pandas中按type匹配字典并仅替换number列为NaN的行?

解决方法:精准匹配条件替换指定行的列值

之前用df.update()会全局替换同type的所有行,没法过滤number为NaN的条件,咱们换用.loc结合布尔掩码来实现精准操作——只对number列为NaN且type匹配字典键的行进行替换。

实现步骤拆解:

  1. 先创建布尔掩码,锁定number为空的目标行;
  2. 遍历字典里的每个类型键,筛选出同时满足掩码和type匹配的行;
  3. 用.loc精准定位这些行和字典中对应的列,赋值替换即可。

完整代码示例:

import numpy as np
import pandas as pd

# 原始数据初始化
data={"col1":[np.nan,3,4,5,9,2,6], "col2":[4,2,4,6,0,1,5], "col3":[7,6,0,11,3,6,7], "col4":[14,11,22,8,6,np.nan,9], "col5":[0,5,7,3,8,2,9], "type":["B","B","C","A","B","A","B"], "number":["one",np.nan,"two","one","one","two",np.nan]}
df=pd.DataFrame.from_dict(data)
my_dict={"F":{"col1":2,"col2":44,"col3":0},"B":{"col1":0,"col2":11,"col3":4,"col4":50,"col5":np.nan}}

# 生成目标行掩码:仅number为NaN的行
target_mask = df['number'].isna()

# 遍历字典中的类型规则,执行替换
for type_key, col_map in my_dict.items():
    # 筛选出符合type条件的目标行
    matched_rows = target_mask & (df['type'] == type_key)
    # 提取要替换的列名
    replace_cols = list(col_map.keys())
    # 精准赋值替换
    df.loc[matched_rows, replace_cols] = pd.Series(col_map)

# 查看最终结果
print(df)

替换后目标DataFrame:

col1  col2  col3  col4  col5 type number
0   NaN   4.0   7.0  14.0   0.0    B    one
1   0.0  11.0   4.0  50.0   NaN    B    NaN
2   4.0   4.0   0.0  22.0   7.0    C    two
3   5.0   6.0  11.0   8.0   3.0    A    one
4   9.0   0.0   3.0   6.0   8.0    B    one
5   2.0   1.0   6.0   NaN   2.0    A    two
6   0.0  11.0   4.0  50.0   NaN    B    NaN

可以看到,只有第1、6行(number为NaN且type为B)的对应列被替换,其他行完全不受影响,刚好符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:17:32