如何在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
相关产品推荐
相关产品推荐

