如何在Pandas中按type匹配字典并仅替换number列为NaN的行?
解决方法:精准匹配条件替换指定行的列值
之前用df.update()会全局替换同type的所有行,没法过滤number为NaN的条件,咱们换用.loc结合布尔掩码来实现精准操作——只对number列为NaN且type匹配字典键的行进行替换。
实现步骤拆解:
- 先创建布尔掩码,锁定
number为空的目标行; - 遍历字典里的每个类型键,筛选出同时满足掩码和type匹配的行;
- 用
.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
相关产品推荐
相关产品推荐

