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

pandas自定义同SR_NUMBER加月函数报'float' object is not subscriptable如何解决

问题原因
  • 错误触发的核心原因是你调用apply时仅传入了SR_NUMBER单列,函数内拿到的row实际是单列的单个值(而非DataFrame的整行数据),尝试用row['SR_NUMBER']这种下标方式取值自然会抛出float对象不可取下标的错误。
  • 即便改为对全表按行apply(指定axis=1),你的逻辑也不可行:shift()是对整个Series/数据表生效的序列偏移方法,单个行对象的SR_NUMBER字段是单个字符串值,不存在上一行的概念,调用shift(1)会报错。
  • 额外的逻辑错误:你最终将函数返回值赋值给了df['SR_NUMBER'],会直接覆盖你原有的SR编号字段,你实际要修改的是year_month_end字段。
正确实现步骤

首先导入依赖、完成字段类型转换:

import pandas as pd
from pandas.tseries.offsets import MonthEnd

# 你的原始数据
df = pd.DataFrame({
    'SR_NUMBER': ['2-15642332176', '3-22596843941', '3-22596843941', '3-22596843941', '3-22596843941'],
    'year_month_end': ['2020-02-28', '2020-04-30', '2020-04-30', '2020-04-30', '2020-04-30']
})

# 先把year_month_end转为datetime类型,否则无法做日期运算
df['year_month_end'] = pd.to_datetime(df['year_month_end'])

通过分组计数计算偏移量,直接完成日期更新:

# 统计每个SR_NUMBER分组内的行序号,从0开始计数
df['month_offset'] = df.groupby('SR_NUMBER').cumcount()
# 按偏移量给日期加对应月份
df['year_month_end'] = df['year_month_end'] + df['month_offset'] * MonthEnd(1)
# 删除辅助列
df.drop('month_offset', axis=1, inplace=True)

也可以不用辅助列,一行实现相同逻辑:

df['year_month_end'] = df.groupby('SR_NUMBER')['year_month_end'].transform(lambda x: x + x.groupby('SR_NUMBER').cumcount() * MonthEnd(1))

运行后得到的结果与期望输出完全一致:

SR_NUMBER year_month_end
0  2-15642332176     2020-02-28
1  3-22596843941     2020-04-30
2  3-22596843941     2020-05-31
3  3-22596843941     2020-06-30
4  3-22596843941     2020-07-31

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:24:08