如何用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
相关产品推荐
相关产品推荐

