Pandas DataFrame如何基于连续状态最后一次有效出现获取对应值
实现方法
核心逻辑是直接定位每个连续相同Status分段的末尾行,给末尾行赋值对应Energy值,其余行填充空值即可,不需要复杂的cumsum重置逻辑。
完整可运行代码
import pandas as pd import numpy as np # 构造样例数据 df = pd.DataFrame({ 'Status': [1,1,1,1,0,0,0,1,0,0], 'Energy': [2,3,2,4,12,13,11,3,15,14] }) # 识别连续段末尾:当前行Status和下一行Status不相等,即为段尾(最后一行自动判定为段尾) is_segment_end = df['Status'].ne(df['Status'].shift(-1)) # 赋值结果列 df['Result_outcome'] = np.where(is_segment_end, df['Energy'], np.nan)
结果验证
运行代码后输出的DataFrame和预期完全一致:
Status Energy Result_outcome 0 1 2 NaN 1 1 3 NaN 2 1 2 NaN 3 1 4 4.0 4 0 12 NaN 5 0 13 NaN 6 0 11 11.0 7 1 3 3.0 8 0 15 NaN 9 0 14 14.0
逻辑说明
df['Status'].shift(-1):将Status列整体向上移1位,每行拿到下一行的Status值ne()是不等于判断:当当前行Status和下一行Status不相等时,说明当前行是连续同值段的最后一行;DataFrame最后一行没有下一行,移位后得到空值,ne()和空值比较会返回True,自动判定为最后一个分段的末尾,不需要额外补边界逻辑- 该方法是向量化运算,性能远高于循环、分组apply写法,百万级数据也可快速运行
内容的提问来源于stack exchange,提问作者prashant thakre
相关产品推荐
相关产品推荐

