遍历Pandas DataFrame行时使用shift()报错,求迭代下的解决方法
解决'numpy.int64' object has no attribute 'shift'并保留迭代获取最后符合条件索引
你报错的核心原因是iterrows()返回的row里的单个元素是numpy数值类型,而shift()是pandas Series/DataFrame专属的方法,单个数值自然没有这个属性。
要保留迭代逻辑的话,先提前对整个B列做shift处理,把结果存下来,之后在迭代时直接用预处理好的值判断即可,同时用变量记录最后一个符合条件的索引:
import pandas as pd df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]], columns=['A', 'B', 'C']) # 提前计算B列shift(1)的结果,生成新列 df['B_shifted'] = df['B'].shift(1) last_valid_idx = None for index, row in df.iterrows(): # 排除shift后产生的NaN值(第一行无前置数据),再做数值判断 if pd.notna(row['B_shifted']) and row['B_shifted'] >= 4: last_valid_idx = index # 打印最后一个符合条件的索引 if last_valid_idx is not None: print(last_valid_idx)
如果不想新增列,也可以直接通过Series索引取值:
import pandas as pd df = pd.DataFrame([[0, 2, 3], [0, 4, 1], [10, 20, 30]], columns=['A', 'B', 'C']) b_shifted = df['B'].shift(1) last_valid_idx = None for index, row in df.iterrows(): shifted_val = b_shifted[index] if pd.notna(shifted_val) and shifted_val >= 4: last_valid_idx = index print(last_valid_idx if last_valid_idx is not None else "无符合条件的索引")
内容的提问来源于stack exchange,提问作者Geo
相关产品推荐
相关产品推荐

