如何基于上下行值替换DataFrame列中的See Above/See Below值?
高效处理DataFrame中的'See Above'和'See Below'值
先重现你的数据场景:
import pandas as pd df = pd.DataFrame([[1, 'Cat'], [1, 'See Above'], [4, 'See Below'],[2, 'Dog']], columns=['A','B'])
初始数据:
| A | B | |
|---|---|---|
| 0 | 1 | Cat |
| 1 | 1 | See Above |
| 2 | 4 | See Below |
| 3 | 2 | Dog |
矢量化替换方案(适配230万行大数量级)
因为数据量很大,绝对不能用循环或逐行处理,得用pandas的矢量化操作——底层优化过,速度快很多。
- 替换
See Above:用上一行的B列值,用shift(1)获取上一行数据,再用mask只替换目标值 - 替换
See Below:用下一行的B列值,用shift(-1)获取下一行数据,同样用mask替换
代码如下:
# 替换'See Above'为上一行的值 df['B'] = df['B'].mask(df['B'] == 'See Above', df['B'].shift(1)) # 替换'See Below'为下一行的值 df['B'] = df['B'].mask(df['B'] == 'See Below', df['B'].shift(-1))
处理后结果:
| A | B | |
|---|---|---|
| 0 | 1 | Cat |
| 1 | 1 | Cat |
| 2 | 4 | Dog |
| 3 | 2 | Dog |
额外说明
- 连续重复场景:如果有连续多个
See Above(比如['Cat', 'See Above', 'See Above']),shift(1)会自动让后续的See Above取已经替换好的上一行值,结果和预期一致;连续See Below同理。 - 边界值处理:如果第一行是
See Above,shift(1)会得到NaN;最后一行是See Below的话,shift(-1)也会得到NaN,可以根据需求用fillna补默认值:df['B'] = df['B'].fillna('Unknown') - 性能:这种方法处理230万行数据基本几秒就能完成,比循环快几十甚至上百倍。
内容的提问来源于stack exchange,提问作者cb101
相关产品推荐
相关产品推荐

