Pandas用apply设置END_DATE时报'Timestamp' object is not subscriptable如何解决
错误原因
- 你调用
apply的对象是df_5['END_DATE']单列,传入自定义函数time1to0的参数是每行对应字段的单个Timestamp值,而非完整DataFrame,在函数内尝试用下标取SCU_KEY等其他字段自然会触发'Timestamp' object is not subscriptable报错。 - 原代码里使用
shift(1)取的是上一行数据,和你需要的「取下一行字段值」的需求完全相反,就算调用方式修正也得不到预期结果。
正确实现
不需要使用apply,直接用布尔索引批量筛选赋值即可,执行效率更高:
# 构造匹配条件 mask = ( # 当前行REVENUE_STATUS_FLAG为1,下一行变为0 (df_5['REVENUE_STATUS_FLAG'] == 1) & (df_5['REVENUE_STATUS_FLAG'].shift(-1) == 0) # 当前行与下一行SCU_KEY、PRODUCT完全一致 & (df_5['SCU_KEY'] == df_5['SCU_KEY'].shift(-1)) & (df_5['PRODUCT'] == df_5['PRODUCT'].shift(-1)) ) # 符合条件的行,END_DATE赋值为下一行的OPTY_CLOSE_DATE df_5.loc[mask, 'END_DATE'] = df_5['OPTY_CLOSE_DATE'].shift(-1).loc[mask]
注意事项
运行代码前请确保DataFrame已经按照SCU_KEY、PRODUCT和对应时间维度排序,保证shift(-1)取到的是同组的下一行数据,不会出现跨组匹配的问题。
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

