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

pandas报list无assign属性错误及按条件插入行问题求解

问题

现有如下结构的DataFrame:

SRC  Coup  Vint    Bal   Mar   Apr   May   Jun   Jul BondSec
0  JPM   1.5  2021   43.9   5.6   4.9   4.9   5.2   4.4    FNCL
1  JPM   1.5  2020   41.6   6.2   6.0   5.6   5.8   4.8    FNCL
2  JPM   2.0  2021  503.9   7.1   6.3   5.8   6.0   4.9    FNCL
3  JPM   2.0  2020  308.3   9.3   7.8   7.5   7.9   6.6    FNCL
4  JPM   2.5  2021  345.0   8.6   7.8   6.9   6.8   5.6    FNCL
5  JPM   4.5  2010    5.7  21.3  20.0  18.0  17.7  14.6    G2SF
6  JPM   5.0  2019    2.8  39.1  37.6  34.6  30.8  24.2    G2SF
7  JPM   5.0  2018    7.3  39.8  37.1  33.4  30.1  24.2    G2SF
8  JPM   5.0  2010    3.9  23.3  20.0  18.6  17.9  14.6    G2SF
9  JPM   5.0  2009    4.2  22.8  21.2  19.5  18.6  15.4    G2SF

需求:

  1. 复制所有BondSec值为FNCL的行,将新行的BondSec值改为FGLMC,插入到所有FNCL行的末尾(即FNCL和下一个分组的分界位置)
  2. 后续对BondSec值为FNCI的行做相同操作,复制后改值为FGCI,插入到FNCI分组末尾
  3. 不能用固定行号,要适配不同行数的输入文件

现有代码执行时触发AttributeError: 'list' object has no attribute 'assign'报错:

if "FGLMC" not in jpm['BondSec']:
    is_FNCL = jpm['BondSec'] == "FNCL"
    FNCL_try = jpm[is_FNCL]
    jpm.append([FNCL_try]*1,ignore_index=True)

# 报错代码
jpm.append(([FNCL_try]*1).assign(**{'BondSecurity': 'FGLMC'}),ignore_index=True)

解答

报错原因

  • [FNCL_try]*1是将DataFrame封装为Python列表,列表对象没有pandas的assign方法,直接调用必然报错
  • 代码中列名写错:原列名是BondSec,代码里写成了BondSecurity,即使解决列表问题也会触发键错误
  • pandas 1.4及以上版本已经弃用append方法,官方推荐使用pd.concat做表拼接

实现代码

把复制、改值、插入的逻辑封装为通用函数,处理不同分组时直接传参即可,无需重复写代码:

import pandas as pd

def copy_sec_rows(df, source_label, target_label):
    # 目标标签已存在时跳过,避免重复插入
    if target_label in df['BondSec'].unique():
        return df
    # 筛选待复制行,修改BondSec值,加copy避免SettingWithCopyWarning
    copied = df[df['BondSec'] == source_label].copy()
    copied['BondSec'] = target_label
    # 定位源分组最后一行的索引位置
    last_source_pos = df[df['BondSec'] == source_label].index[-1]
    # 拆分原表为上下两部分,将复制行插入中间后重置索引
    part_upper = df.loc[:last_source_pos]
    part_lower = df.loc[last_source_pos+1:]
    return pd.concat([part_upper, copied, part_lower], ignore_index=True)

调用示例

# 处理FNCL -> FGLMC
jpm = copy_sec_rows(jpm, source_label='FNCL', target_label='FGLMC')
# 处理FNCI -> FGCI
jpm = copy_sec_rows(jpm, source_label='FNCI', target_label='FGCI')

针对给出的示例数据,处理后输出结果如下,FGLMC行正好插入在FNCL分组末尾、G2SF分组之前:

SRC  Coup  Vint    Bal   Mar   Apr   May   Jun   Jul BondSec
0   JPM   1.5  2021   43.9   5.6   4.9   4.9   5.2   4.4    FNCL
1   JPM   1.5  2020   41.6   6.2   6.0   5.6   5.8   4.8    FNCL
2   JPM   2.0  2021  503.9   7.1   6.3   5.8   6.0   4.9    FNCL
3   JPM   2.0  2020  308.3   9.3   7.8   7.5   7.9   6.6    FNCL
4   JPM   2.5  2021  345.0   8.6   7.8   6.9   6.8   5.6    FNCL
5   JPM   1.5  2021   43.9   5.6   4.9   4.9   5.2   4.4   FGLMC
6   JPM   1.5  2020   41.6   6.2   6.0   5.6   5.8   4.8   FGLMC
7   JPM   2.0  2021  503.9   7.1   6.3   5.8   6.0   4.9   FGLMC
8   JPM   2.0  2020  308.3   9.3   7.8   7.5   7.9   6.6   FGLMC
9   JPM   2.5  2021  345.0   8.6   7.8   6.9   6.8   5.6   FGLMC
10  JPM   4.5  2010    5.7  21.3  20.0  18.0  17.7  14.6    G2SF
11  JPM   5.0  2019    2.8  39.1  37.6  34.6  30.8  24.2    G2SF
12  JPM   5.0  2018    7.3  39.8  37.1  33.4  30.1  24.2    G2SF
13  JPM   5.0  2010    3.9  23.3  20.0  18.6  17.9  14.6    G2SF
14  JPM   5.0  2009    4.2  22.8  21.2  19.5  18.6  15.4    G2SF

说明

  • 逻辑不依赖固定行号,只要同类型BondSec值是连续排列的(符合业务数据按BondSec分组排序的场景),不管每个分组有多少行都能准确定位插入位置
  • 新增重复校验逻辑,多次运行代码不会重复插入相同的目标行
  • 后续如果有其他同规则的复制需求,直接传入对应的源标签和目标标签即可,无需修改函数逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:03:23