如何将DataFrame指定列的每行转为单个numpy数组?
嘿,我明白你的需求了——你不想得到一个大的二维numpy数组,而是要把每一行的sepal_length和sepal_width拆成单独的点(比如point1=[5.1,3.5]这种形式)对吧?这里有几个实用的方法,你可以根据自己的场景选择:
几种可行的解决方案
方法1:用apply逐行生成列表(直观易懂)
这是最直接的写法,对选中的两列逐行处理,把每行转成列表:
import pandas as pd # 假设你的DataFrame名为df points = df[['sepal_length', 'sepal_width']].apply(lambda row: row.tolist(), axis=1).tolist()
执行后points就是一个嵌套列表,每个元素对应一行的两个值,比如[[5.1, 3.5], [4.9, 3], ...]。你可以通过索引直接取单个点,比如points[0]就是第一个数据点。
方法2:基于numpy数组拆分(高效简洁)
如果你已经用to_numpy()得到了二维数组,也可以直接遍历这个数组,把每一行单独拿出来:
import numpy as np # 先转成二维numpy数组 arr = df[['sepal_length', 'sepal_width']].to_numpy() # 遍历拆分出每个行作为单个点 points = [row for row in arr]
这里每个points[i]是一个一维numpy数组(比如array([5.1, 3.5])),如果需要转成普通列表,改成[row.tolist() for row in arr]就行。这种方法比apply效率更高,数据量大的时候优势明显。
方法3:用itertuples(性能最优)
如果你的数据集很大,追求极致性能的话,推荐用itertuples——它比iterrows快得多,是pandas里遍历行的高效方式:
# 用列表推导式简化写法 points = [[row.sepal_length, row.sepal_width] for row in df[['sepal_length', 'sepal_width']].itertuples(index=False)]
这里index=False表示不返回原DataFrame的索引,只取我们需要的两个字段值。
小补充
- 如果你需要保留原DataFrame的索引和对应关系,可以不用加
.tolist()(比如方法1里只到apply(...)),这样得到的是一个Series,每个索引对应一个点的列表。 - 如果需要的是numpy数组类型的单个点,方法2的写法直接就能满足,不需要额外转换。
内容的提问来源于stack exchange,提问作者user14416085
相关产品推荐
相关产品推荐

