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

高效修改DataFrame值:满足条件时将指定列设为np.nan

Pandas 按条件更新DataFrame列值(避免修改副本警告)

需求说明

当DataFrame中c1列出现值32时,将对应行的c2列值更新为np.nan。

示例原始数据

c1    c2
a    1    8
b    2    8
c    3    8
d    4    8
e   32    8
f   32    8
g    2    8

修改后目标数据

c1    c2
a    1    8
b    2    8
c    3    8
d    4    8
e   32    nan
f   32    nan
g    2    8

优化解决方案

你当前的代码过于复杂,完全不需要通过索引位置转换来实现。以下两种方法简洁高效,且不会触发"修改副本"的警告:

方法1:使用.loc直接原地修改(官方推荐)

这是最直接的原地修改方式,直接定位符合条件的行和目标列赋值:

import pandas as pd
import numpy as np

df = pd.DataFrame(data={'c1':[1,2,3,4,32,32,2], 'c2':[8,8,8,8,8,8,8]}, index=list('abcdefg'))
# 核心代码:条件行 + 目标列直接赋值
df.loc[df['c1'] == 32, 'c2'] = np.nan

df.loc[行筛选条件, 列名]会直接操作原始DataFrame的目标区域,不存在副本修改的问题,是Pandas官方推荐的赋值方式。

方法2:用numpy.where生成新列(非原地修改)

如果需要保留原数据,或者希望生成新列,可以用np.where生成新的列值替换原列:

df['c2'] = np.where(df['c1'] == 32, np.nan, df['c2'])

这种方式通过计算新的列值覆盖原列,同样不会触发副本警告。

为什么你的代码复杂?

你之前的代码通过列表推导式转换索引位置,属于绕远路的写法——Pandas的.loc已经内置了行条件匹配和列定位的功能,完全不需要手动转换索引位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:37:48