修复Pandas代码:用最近OPEN行B值填充对应CLOSE行C列
修复方案:匹配最近OPEN行的B值到CLOSE行的C列
问题分析
你的原代码错误在于使用groupby('A')后,transform(lambda x: x.shift())只会在**同组内(即所有CLOSE行组成的组)**向上移位,自然取到的是上一个CLOSE行的B值,而非最近的OPEN行的值。
正确实现步骤
我们可以通过标记OPEN行的B值并向前填充的方式,让每个CLOSE行自动关联到上方最近的OPEN行的B值:
1. 示例数据构造(方便验证)
import pandas as pd # 模拟你的数据结构 data = pd.DataFrame({ 'A': ['OPEN', 'OTHER', 'CLOSE', 'OPEN', 'CLOSE', 'OTHER', 'OPEN', 'OTHER', 'CLOSE'], 'B': [23120, 123, 456, 23330, 789, 345, 23440, 678, 901] })
2. 一行代码实现需求
# 仅在A列为CLOSE时,将最近的上方OPEN行的B值填充到C列 data.loc[data['A'] == 'CLOSE', 'C'] = data['B'].where(data['A'] == 'OPEN').ffill()
3. 分步逻辑解释
data['B'].where(data['A'] == 'OPEN'):只保留OPEN行的B值,其他行设为NaN.ffill():向前填充NaN,让每个位置都拿到最近的上方OPEN行的B值- 最后通过
loc筛选出CLOSE行,将填充后的值赋值给C列
验证结果
执行后你的DataFrame会变成:
| A | B | C | |
|---|---|---|---|
| 0 | OPEN | 23120 | NaN |
| 1 | OTHER | 123 | NaN |
| 2 | CLOSE | 456 | 23120.0 |
| 3 | OPEN | 23330 | NaN |
| 4 | CLOSE | 789 | 23330.0 |
| 5 | OTHER | 345 | NaN |
| 6 | OPEN | 23440 | NaN |
| 7 | OTHER | 678 | NaN |
| 8 | CLOSE | 901 | 23440.0 |
完全符合你期望的第一个CLOSE行C列值为23120,下一个为23330的需求。
内容的提问来源于stack exchange,提问作者whatever
相关产品推荐
相关产品推荐

