如何将CSV数据自动提取并映射至指定矩阵位置?
解决方案
问题分析
你当前代码的核心问题有两个:
- 行和列的维度搞反了:需求是Sector作为行,Service作为列,但你用
service.nunique()作为行数,sector.nunique()作为列数,完全颠倒了维度对应关系。 - 缺少Sector/Service到矩阵索引的映射关系,无法定位每个数据点在矩阵中的具体位置。
修正代码(基础遍历版)
import numpy as np import pandas as pd # 一次性读取整个CSV,避免重复IO操作 df = pd.read_csv('Coeff_Sample.csv') # 获取唯一的Sector和Service列表,建立索引映射字典 unique_sectors = df['Sector'].unique() unique_services = df['Service'].unique() sector_to_idx = {sector: i for i, sector in enumerate(unique_sectors)} service_to_idx = {service: j for j, service in enumerate(unique_services)} # 创建正确尺寸的零矩阵:行数=唯一Sector数量,列数=唯一Service数量 coeff_matrix = np.zeros((len(unique_sectors), len(unique_services))) # 遍历每一行数据,填充矩阵对应位置 for _, row in df.iterrows(): sector = row['Sector'] service = row['Service'] value = row['Data_Point'] # 通过映射找到行、列索引 i = sector_to_idx[sector] j = service_to_idx[service] coeff_matrix[i, j] = value # 可选:打印验证结果 print("行标签(Sector):", unique_sectors) print("列标签(Service):", unique_services) print("\n填充后的矩阵:\n", coeff_matrix)
更简洁的Pandas透视表实现
如果不需要手动操作numpy矩阵,用Pandas的pivot_table可以一步生成目标矩阵,效率更高:
import pandas as pd import numpy as np df = pd.read_csv('Coeff_Sample.csv') # 生成透视表,自动填充数据,缺失位置补0 pivot_df = df.pivot_table( index='Sector', columns='Service', values='Data_Point', fill_value=0 ) # 转成numpy矩阵格式 coeff_matrix = pivot_df.to_numpy() # 查看结果 print("透视表形式:\n", pivot_df) print("\nNumpy矩阵形式:\n", coeff_matrix)
关键说明
- 两种方法都会保留Sector和Service的原始出现顺序作为矩阵的行/列顺序;如果需要排序,可在获取
unique_sectors和unique_services时加上sorted()。 - 透视表方法更适合大型CSV文件,Pandas内部做了性能优化,比手动遍历效率更高。
内容的提问来源于stack exchange,提问作者Dr. Merkwürdigliebe
相关产品推荐
相关产品推荐

