如何用Pandas/Numpy填充DataFrame中A、B间的None以避免连续值
问题与解决方案
原始DataFrame
| index | Value |
|---|---|
| 1 | None |
| 2 | A |
| 3 | None |
| 4 | A |
| 5 | B |
| 6 | B |
| 7 | None |
| 8 | A |
| 9 | A |
| 10 | B |
需求说明
消除列中连续出现的A或B,将连续重复的非None值(除第一个外)替换为None,最终列中不存在连续的A或B。
期望输出
| index | Value |
|---|---|
| 1 | None |
| 2 | A |
| 3 | None |
| 4 | None |
| 5 | B |
| 6 | None |
| 7 | None |
| 8 | A |
| 9 | None |
| 10 | B |
非循环实现方案(Pandas)
利用Pandas向量化操作完成,无需循环:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'index': range(1, 11), 'Value': [None, 'A', None, 'A', 'B', 'B', None, 'A', 'A', 'B'] }).set_index('index') # 获取每个位置向前填充的最近非空值 prev_non_null = df['Value'].ffill() # 生成掩码:当前值非空且与上一个非空值重复 mask = df['Value'].notna() & (df['Value'] == prev_non_null.shift()) # 将重复的非空值替换为None df.loc[mask, 'Value'] = None print(df)
逻辑说明
ffill():向前填充非空值,得到每个位置对应的最近上一个非None值;prev_non_null.shift():将填充结果下移一位,与当前行Value对比,判断是否为连续重复的非空值;- 通过掩码筛选出重复值位置,批量替换为
None。
内容的提问来源于stack exchange,提问作者Akav
相关产品推荐
相关产品推荐

