如何将列表数据按指定列分组转换为行列分离的float64类型新矩阵
实现方案
首先说明:你要存储的Names列是字符串类型,无法直接转换为float64类型,若确实需要数值格式的float64矩阵,需要先对字符串做编码处理,两种可选实现方案如下:
方案1:基于你现有代码修改
你已经通过defaultdict得到了分组结果,只需要对分组结果做转置处理即可得到目标结构:
import numpy as np from collections import defaultdict # 你的原有代码 d = defaultdict(list) for key, val in df2: d[key].append(val) # 新增转换逻辑 # 按Animals的数值排序取对应分组列表 sorted_groups = [d[k] for k in sorted(d.keys())] # 转置分组列表,得到每行对应不同Animals的结构 target_matrix = np.array(list(zip(*sorted_groups))) # 如果确实需要float64格式,对字符串做标签编码即可 from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() # 先把所有字符串编码为整数,再转float64 encoded_matrix = encoder.fit_transform(target_matrix.flatten()).reshape(target_matrix.shape).astype(np.float64)
运行后target_matrix的结构就和你期望的表格一致,是2行3列的数组。
方案2:直接用pandas内置方法实现,无需手动循环分组
import pandas as pd # 新增分组内的行号标记 df2['row_id'] = df2.groupby('Animals').cumcount() # 直接用pivot透视得到目标结构 target_df = df2.pivot(index='row_id', columns='Animals', values='Names').reset_index(drop=True) # 转numpy数组直接调用.values即可 target_matrix = target_df.values
补充说明
你之前得到的df3不符合预期,是因为dict.items(d)返回的是(分组键, 分组值列表)的二元组集合,转数组后是3行2列的结构,和你期望的行列方向相反,所以需要先提取所有分组值列表再做转置处理。
内容的提问来源于stack exchange,提问作者vdu16
相关产品推荐
相关产品推荐

