You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas Series中引用当前值与前序/后序值?

如何在Pandas Series中同时引用当前值与前序值

看起来你想要捕捉Recession_start从False切换到True的季度(也就是衰退开始的时间点)对吧?你的循环写法存在逻辑错误,而且在Pandas里用遍历循环处理数据效率很低,我们可以用更优雅的向量化操作来实现需求,以下是具体方法:

核心思路:用shift()获取前序值

Pandas的shift()方法可以轻松获取Series的前一行(或后一行)数据,这样就能直接对比当前值和前序值的状态变化,完全不需要写循环。

方法1:分步实现(清晰易懂)

先新增一列存储前序值,再筛选符合条件的行:

# 新增列存储上一行的Recession_start值,第一行没有前序值会显示NaN
gdp['prev_recession'] = gdp['Recession_start'].shift(1)

# 筛选:当前行是True,且前一行是False的记录(状态从非衰退切换到衰退)
recession_start_quaters = gdp[
    (gdp['Recession_start'] == True) & (gdp['prev_recession'] == False)
]['Quarter']

# 输出结果
for q in recession_start_quaters:
    print(q)

针对你的示例数据,这段代码会输出2000q3,正好是你需要的衰退起始季度。

方法2:简化写法(无需新增列)

如果不想额外增加列,可以直接在筛选条件中嵌套shift(),同时用fillna()处理第一行的NaN:

recession_start_quaters = gdp.loc[
    # 当前为衰退状态,且前序状态为非衰退(第一行默认前序为False)
    gdp['Recession_start'] & ~gdp['Recession_start'].shift(1).fillna(False),
    'Quarter'
]

# 直接输出结果
print(recession_start_quaters.iloc[0])

聊聊你原来代码的问题

你之前的循环写法有几个明显的错误:

  • value & "value+1"是无效运算:&是位运算符,不是逻辑与(应该用and),而且"value+1"是字符串,和布尔值value根本无法对比
  • 手动遍历iteritems()效率极低:Pandas的向量化操作是底层优化的,比Python循环快几个数量级,尤其是数据量较大时
  • 没有正确获取前序值:你需要的前序值应该通过索引偏移获取,而不是这种错误的字符串拼接方式

内容的提问来源于stack exchange,提问作者Yadu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:58