基于列标识填充DataFrame行值:将colA=4的行colC替换为前序colA=3的行值
解决方案
步骤说明
核心思路是先提取所有colA=3对应的colC值,再通过前向填充将这些值传递给后续的colA=4记录,最后完成替换。
代码实现
import pandas as pd # 构造原始DataFrame data = { 'colA': [3,4,4,4,3,4,4,3,4], 'colB': ['air','ground','ground','ground','air','ground','air','ground','ground'], 'colC': ['00JTHYU1','00JTHYU0','00JTHYU0','00JTHYU0','00JTHYU4','00JTHYU0','00JTHYU0','00JTHYU7','00JTHYU0'] } df = pd.DataFrame(data) # 1. 创建辅助列,仅保留colA=3时的colC值,其余为NaN df['colC_3'] = df.loc[df['colA'] == 3, 'colC'] # 2. 对辅助列执行前向填充,让后续行继承最近的colA=3对应的colC值 df['colC_3'] = df['colC_3'].ffill() # 3. 将colA=4的记录的colC替换为填充后的辅助列值,colB保持不变 df.loc[df['colA'] == 4, 'colC'] = df.loc[df['colA'] == 4, 'colC_3'] # 4. 可选:删除辅助列 df = df.drop('colC_3', axis=1) print(df)
执行结果
| colA | colB | colC | |
|---|---|---|---|
| 0 | 3 | air | 00JTHYU1 |
| 1 | 4 | ground | 00JTHYU1 |
| 2 | 4 | ground | 00JTHYU1 |
| 3 | 4 | ground | 00JTHYU1 |
| 4 | 3 | air | 00JTHYU4 |
| 5 | 4 | ground | 00JTHYU4 |
| 6 | 4 | air | 00JTHYU4 |
| 7 | 3 | ground | 00JTHYU7 |
| 8 | 4 | ground | 00JTHYU7 |
为什么直接用ffill/shift没效果?
如果直接对colC用ffill(),会覆盖所有NaN值,但原始colA=4的colC本身有值(00JTHYU0),不会被填充;而单纯shift()只能获取上一行的值,无法精准定位到最近的colA=3的记录。通过先过滤出目标值再填充的方式,才能实现需求。
内容的提问来源于stack exchange,提问作者Connie Xu
相关产品推荐
相关产品推荐

