如何为Pandas DataFrame列的非NaN位置赋值新列表值
解决方案
你已经通过df["value"].notnull()拿到筛选非NaN值的布尔掩码,直接用该掩码定位目标列对应位置,按顺序传入新值列表完成赋值即可,pandas会自动按掩码命中的行顺序匹配列表元素。
完整可运行代码
import pandas as pd import numpy as np # 构造测试数据集 d = { 't': [0, 1, 2, 0, 2, 0, 1], 'input': [2, 2, 2, 2, 2, 2, 4], 'type': ['A', 'A', 'A', 'B', 'B', 'B', 'A'], 'value': [0.1, 0.2, np.nan, np.nan, 2, 3, np.nan], } df = pd.DataFrame(d) new_value = [10, 15, 1, 18] # 生成非NaN值的筛选掩码 mask = df["value"].notnull() # 定位目标位置赋值 df.loc[mask, "value"] = new_value
运行结果
执行后打印DataFrame,输出如下,所有原非NaN位置的值已经按列表顺序替换完成,NaN值保持不变:
t input type value 0 0 2 A 10.0 1 1 2 A 15.0 2 2 2 A NaN 3 0 2 B NaN 4 2 2 B 1.0 5 0 2 B 18.0 6 1 4 A NaN
注意事项
- 赋值前要保证
new_value的长度和掩码中True的数量完全一致,可以先执行print(mask.sum(), len(new_value))校验长度,避免触发长度不匹配报错 - 不要使用链式索引写法
df[mask]["value"] = new_value赋值,这种写法会触发SettingWithCopyWarning警告,还可能出现赋值不生效的问题,统一用df.loc做行列定位是官方推荐的稳妥写法
内容的提问来源于stack exchange,提问作者Natasha
相关产品推荐
相关产品推荐

