如何使用Pandas合并两列并按最近非空值填充后续行?
合并DataFrame列并延续最近非空值的解决方案
问题场景
需要将DataFrame中的GearUp和GearDn两列合并为Gear列,要求Gear列保留最近的非空有效值(如第2行的DOWN会延续到3、4行;第5行的UP延续到6、7行)。原始数据如下:
| Time | GearUp | GearDn |
|---|---|---|
| 1 | NaN | NaN |
| 2 | NaN | DOWN |
| 3 | NaN | NaN |
| 4 | NaN | NaN |
| 5 | UP | NaN |
| 6 | NaN | NaN |
| 7 | NaN | NaN |
期望输出结果:
| Time | Gear |
|---|---|
| 1 | NaN |
| 2 | DOWN |
| 3 | DOWN |
| 4 | DOWN |
| 5 | UP |
| 6 | UP |
| 7 | UP |
若直接使用两次where方法处理,会出现第二次调用覆盖第一次数据的问题,以下是正确实现方案:
实现代码
import pandas as pd import numpy as np # 构造原始数据 df = pd.DataFrame({ 'Time': [1, 2, 3, 4, 5, 6, 7], 'GearUp': [np.nan, np.nan, np.nan, np.nan, 'UP', np.nan, np.nan], 'GearDn': [np.nan, 'DOWN', np.nan, np.nan, np.nan, np.nan, np.nan] }) # 第一步:合并GearUp和GearDn列,提取每行的非空有效值 df['Gear'] = df['GearUp'].combine_first(df['GearDn']) # 第二步:向前填充最近的非空值,实现有效值延续 df['Gear'] = df['Gear'].ffill() # 保留目标列并输出 result = df[['Time', 'Gear']] print(result)
代码说明
combine_first方法:优先取GearUp的非空值,当GearUp为空时,取GearDn的非空值,完美提取出每行的有效Gear状态,避免了多次where调用导致的覆盖问题。ffill()方法:将后续的空值替换为前面最近的非空值,实现有效值的向下延续,满足需求中“保留最近非空有效值”的要求。
内容的提问来源于stack exchange,提问作者user1412867
相关产品推荐
相关产品推荐

