Python:如何用前次非相等状态值填充DataFrame的C列?
问题解决:DataFrame中填充上一次非重复状态值
原始实现与问题
原始通过np.select根据A、B列数值关系生成C列,代码如下:
import numpy as np import pandas as pd # 假设df是目标DataFrame conditions = [df['A'] > df['B'], (df['A'] == df['B']), df['A'] < df['B']] choices = ["A大于B", 'same', 'B大于A'] df["C"] = np.select(conditions, choices, default=np.nan)
生成的结果如下:
| A | B | C |
|---|---|---|
| 1 | 2 | B大于A |
| 2 | 2 | same |
| 2 | 2 | same |
| 3 | 2 | A大于B |
| 3 | 3 | same |
| 3 | 3 | same |
| 3 | 6 | B大于A |
现在需要将C列中标记为same的行,替换为上一次A、B数值不等时的状态值,预期结果:
| A | B | C |
|---|---|---|
| 1 | 2 | B大于A |
| 2 | 2 | B大于A |
| 2 | 2 | B大于A |
| 3 | 2 | A大于B |
| 3 | 3 | A大于B |
| 3 | 3 | A大于B |
| 3 | 6 | B大于A |
解决方案
可以通过替换same为缺失值,再使用向前填充实现需求,步骤如下:
- 按原始逻辑生成C列,将
same替换为缺失值 - 用
ffill()方法向前填充,即用上一个非缺失值覆盖当前缺失值
代码实现:
# 生成初始C列 conditions = [df['A'] > df['B'], (df['A'] == df['B']), df['A'] < df['B']] choices = ["A大于B", 'same', 'B大于A'] df["C"] = np.select(conditions, choices, default=np.nan) # 替换same为缺失值并向前填充 df["C"] = df["C"].replace('same', pd.NA).ffill()
关于“将前一个变量的值赋给当前变量”的说明
在Pandas中实现这类需求,常用方法有两种:
- 向前填充法:
ffill()或fillna(method='ffill'),自动用前一个非缺失值填充当前缺失值,适合连续重复的场景,无需额外处理边界值 - 手动取前值法:用
shift()获取前一行的数值,再通过条件判断替换,示例:
注意:# 生成前一行的C列值 df['prev_C'] = df['C'].shift(1) # 当当前C为same时,用前一行的值替换 df['C'] = np.where(df['C'] == 'same', df['prev_C'], df['C'])shift(1)会让第一行的prev_C变为NaN,如果第一行是same需要额外处理,而ffill()会自动保留第一个有效值,更适配你的场景。
内容的提问来源于stack exchange,提问作者Batuhan Hazar GÜLER
相关产品推荐
相关产品推荐

