如何向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
解决方案
报错原因
- 尝试代码逻辑存在缺陷:插入后未终止内层循环,会导致同一列表重复插入数值;且当
j=0时往前行列表插入的逻辑不符合需求。 - 出现
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
相关产品推荐
相关产品推荐

