如何优雅地将Pandas DataFrame指定列转为嵌套浮点数组?
问题描述
现有如下示例DataFrame:
col1 col2 col3 1 1 2 3 2 4 5 6 3 7 8 9 4 10 11 12
需要新增一列new,该列元素为嵌套数组格式[[值1,值2]],其中值来自指定列(如col2、col3)的浮点型数值,最终输出如下:
col1 col2 col3 new 1 1 2 3 [[2,3]] 2 4 5 6 [[5,6]] 3 7 8 9 [[8,9]] 4 10 11 12 [[11,12]]
当前已有可行但繁琐的实现代码:
selected_columns = ["col2", "col3"] df[selected_columns] = df[selected_columns].astype(float) df['new'] = df.apply(lambda r: tuple(r[selected_columns]), axis=1) .apply(np.array) .apply(lambda r: tuple(r[["new"]]), axis=1) .apply(np.array)
作为Pandas和NumPy新手,希望找到更简洁高效的实现方法。
更优实现方法
方法一:利用NumPy向量化操作构造嵌套数组
这种方法避免多次调用apply,效率最高,适合大数据集:
import numpy as np import pandas as pd selected_columns = ["col2", "col3"] # 转换指定列为浮点型 df[selected_columns] = df[selected_columns].astype(float) # 提取数值并reshape成嵌套结构,转成列表赋值 df['new'] = list(np.array(df[selected_columns]).reshape(-1, 1, 2))
解释:np.array(df[selected_columns])生成形状为(4,2)的数组,reshape(-1,1,2)将其转换为(4,1,2)的三维数组,转成列表后正好匹配[[值1,值2]]的格式。
方法二:单次apply直接构造嵌套列表
如果习惯用apply,可以简化为一次调用:
selected_columns = ["col2", "col3"] df[selected_columns] = df[selected_columns].astype(float) df['new'] = df[selected_columns].apply(lambda x: [[x.col2, x.col3]], axis=1)
解释:直接在apply逻辑里构造嵌套列表,一步完成转换,比多次链式调用简洁很多。
方法三:Python列表推导式
用纯列表推导实现,可读性强:
selected_columns = ["col2", "col3"] df[selected_columns] = df[selected_columns].astype(float) df['new'] = [[[row.col2, row.col3]] for _, row in df.iterrows()]
内容的提问来源于stack exchange,提问作者user16107137
相关产品推荐
相关产品推荐

