如何在Pandas中填充上下值一致的连续False单元格?
解决Pandas DataFrame中连续False值的条件替换问题
输入数据
import pandas as pd df = pd.DataFrame({'City': ['Barcelona', 'Barcelona', False, False, False, 'Barcelona', 'Paris', False, 'London', False, 'London']})
期望输出
out = pd.DataFrame({'City': ['Barcelona', 'Barcelona', 'Barcelona', 'Barcelona', 'Barcelona', 'Barcelona', 'Paris', False, 'London', 'London', 'London']})
解决方案(高效向量化实现)
# 生成前向填充的有效城市列(每个位置取前面最近的非False城市) prev_city = df['City'].where(df['City'] != False).ffill() # 生成后向填充的有效城市列(每个位置取后面最近的非False城市) next_city = df['City'].where(df['City'] != False).bfill() # 标记需要替换的False位置:当前是False,且前后城市一致 replace_mask = (df['City'] == False) & (prev_city == next_city) # 执行替换 df.loc[replace_mask, 'City'] = prev_city
步骤解释
- 前向/后向填充:
ffill()和bfill()分别把每个False位置替换成它前后最近的有效城市名,快速获取每个False的"上下文"城市信息。 - 掩码筛选:通过逻辑运算精准定位需要替换的False——仅当前后城市完全相同时才替换,前后城市不同的False(比如Paris与London之间的)则保留原值。
- 批量替换:用
loc直接对符合条件的位置赋值,比循环类方法效率更高,适配大数据量场景。
验证结果
执行代码后,df结果与期望输出完全一致:
City 0 Barcelona 1 Barcelona 2 Barcelona 3 Barcelona 4 Barcelona 5 Barcelona 6 Paris 7 False 8 London 9 London 10 London
内容的提问来源于stack exchange,提问作者mab15
相关产品推荐
相关产品推荐

