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

