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

如何用Pandas批量修改DataFrame列中1和2之间的所有值为9?

解决方法

我们可以利用Pandas的向量化操作来实现需求,完全不需要循环。核心思路是标记出所有以1开头到对应2结束的区间,再对这些区间内的值批量修改为9。

方法一:分组标记法

通过生成起始和结束分组ID,精准定位需要修改的区间:

import pandas as pd

df = pd.DataFrame({'a':[2, 0, 1, 2, 0, 1, 0, 0, 2, 0, 1, 0, 0, 2, 0, 1]})

# 生成起始分组:每遇到1就开启一个新分组
start_groups = (df['a'] == 1).cumsum()
# 生成结束标记:遇到2时标记上一行(当前分组的结束位置)
end_groups = (df['a'] == 2).shift(1).fillna(0).cumsum()
# 筛选出未结束的有效区间
mask = start_groups > end_groups
# 排除最后一个没有对应2的1
last_one_mask = (df['a'] == 1) & (start_groups == start_groups.max()) & (end_groups == start_groups.max() - 1)
mask = mask & ~last_one_mask

# 赋值生成结果列
df['desired'] = df['a'].where(~mask, 9)
print(df)

方法二:填充标记法

用ffill()直接标记区间,写法更简洁:

import pandas as pd

df = pd.DataFrame({'a':[2, 0, 1, 2, 0, 1, 0, 0, 2, 0, 1, 0, 0, 2, 0, 1]})

# 把1设为开启标记(True),2设为关闭标记(False),其余值向前填充标记
mask = df['a'].replace({1: True, 2: False}).ffill()
# 处理末尾无对应2的1
if df.iloc[-1]['a'] == 1:
    mask.iloc[-1] = False

df['desired'] = df['a'].where(~mask, 9)
print(df)

输出结果

两种方法都会得到符合需求的结果:

a  desired
0   2        2
1   0        0
2   1        9
3   2        9
4   0        0
5   1        9
6   0        9
7   0        9
8   2        9
9   0        0
10  1        9
11  0        9
12  0        9
13  2        9
14  0        0
15  1        1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:54:14