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

如何向Pandas DataFrame列表列插入指定值?解决numpy.ndarray报错

问题

需要实现向Pandas DataFrame的numbers列(元素为列表)中插入传入的数值,例如传入14.5时,要在group为0的numbers列表的14和15之间插入该值。但编写的代码执行insert操作时出现错误:numpy.ndarray object has no attribute 'insert',请求解决问题并实现需求。

初始代码

import pandas as pd

def twod_array(num):
    data = {"group": [-1, 0, 1, 2],
            'numbers': [[2], [14, 15], [16, 17], [19, 20, 21]],
            }
    df = pd.DataFrame(data=data)
    print(df)
    return 0

当前输出

group       numbers
0     -1           [2]
1      0      [14, 15]
2      1      [16, 17]
3      2  [19, 20, 21]

期望输出(传入num=14.5时)

group       numbers
0     -1           [2]
1      0      [14,14.5,15]
2      1      [16, 17]
3      2  [19, 20, 21]

报错的尝试代码

df = pd.DataFrame({"group": [-1, 0, 1, 2],
        'numbers': [[2], [14, 15], [16, 17], [19, 20, 21]],
        })
arr = df['numbers'].to_list()
num = 14.5

for i, sub_arr in enumerate(arr):
      for j, n in enumerate(sub_arr):
            if arr[i][j]>num:
                  if j!=0: 
                    arr[i].insert(j,num)
                  else: arr[i-1].insert(-1 ,num)

df['numbers'] = arr
解决方案

报错原因

  1. 尝试代码逻辑存在缺陷:插入后未终止内层循环,会导致同一列表重复插入数值;且当j=0时往前行列表插入的逻辑不符合需求。
  2. 出现numpy.ndarray相关错误,大概率是DataFrame的numbers列元素在操作中被隐式转换为numpy数组,而数组没有insert方法。

修正后的代码

import pandas as pd

def insert_number_to_df(num):
    # 初始化DataFrame
    df = pd.DataFrame({
        "group": [-1, 0, 1, 2],
        'numbers': [[2], [14, 15], [16, 17], [19, 20, 21]],
    })
    
    # 遍历每一行,处理numbers列表
    for idx in df.index:
        num_list = df.at[idx, 'numbers']
        insert_pos = None
        # 找到第一个大于目标数值的元素位置
        for i, n in enumerate(num_list):
            if n > num:
                insert_pos = i
                break
        if insert_pos is not None:
            num_list.insert(insert_pos, num)
        else:
            # 所有元素都小于等于目标值,追加到列表末尾
            num_list.append(num)
    
    print(df)
    return df

# 测试传入14.5的情况
insert_number_to_df(14.5)

代码说明

  • 使用df.at[idx, 'numbers']直接获取对应行的列表,确保操作的是原生Python列表而非numpy数组。
  • 遍历每个列表时,找到第一个大于目标数值的元素索引,将数值插入到该位置前,保证列表的有序性。
  • 若列表中所有元素都小于等于目标数值,则将数值追加到列表末尾。
  • 插入完成后自动终止内层循环,避免重复插入。

执行结果

group         numbers
0     -1             [2]
1      0  [14, 14.5, 15]
2      1        [16, 17]
3      2    [19, 20, 21]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:09:35