Python实现CSV数据集行列同名单元格归集及平均值计算
行列同名交叉单元格取值与平均值计算实现方案
实现目标:匹配CSV中行名称(行首列文本)与列名称(表头文本)完全一致的交叉单元格,归集符合条件的数值后计算算术平均值。
参考CSV样例结构:
典型带行索引的CSV结构示例(第一列为行名称,无专属列名,后续行为列对应数据):
,指标A,指标B,指标C 指标A,12,3,5 指标B,4,15,6 指标C,7,8,20按照需求需提取的单元格为:(指标A行, 指标A列)的12、(指标B行, 指标B列)的15、(指标C行, 指标C列)的20,对应平均值为15.67。
基于Pandas的实现方案(适配中大型数据量,推荐使用)
实现逻辑:
- 读取CSV时将行名称所在列设置为DataFrame索引,保留原始行列名称的映射关系
- 计算行索引与列名的交集,得到所有满足名称完全匹配的标签集合
- 逐标签提取对应交叉单元格的数值,避免嵌套循环的性能损耗
- 处理无匹配项的边界场景,避免除零异常
对应可运行代码:
import pandas as pd # 读取CSV,index_col=0表示将第一列设置为行名称索引 df = pd.read_csv("your_dataset.csv", index_col=0) # 提取行名和列名的完全匹配集合 matched_labels = df.index.intersection(df.columns) # 归集所有匹配位置的数值 matched_values = [df.loc[label, label] for label in matched_labels] # 计算平均值,无匹配项时返回0避免报错 average = sum(matched_values) / len(matched_values) if matched_values else 0
使用注意:
- 如果实际CSV中行名称不在第一列,只需要调整
read_csv的index_col参数为行名所在的列序号即可 - 该实现为严格字符串匹配,若需要忽略名称前后空格、大小写差异,可在读取后对索引和列名做统一预处理,比如
df.index = df.index.str.strip()、df.columns = df.columns.str.strip().str.lower()
纯Python标准库实现方案(无第三方依赖,适合小数据量)
实现逻辑:
- 读取CSV表头,构建列名到列索引的映射字典,提升查找效率
- 逐行读取数据,将当前行的行名称与列名映射表做匹配,命中则提取对应位置的数值
- 过滤无法转换为数值的无效单元格,避免计算报错
对应可运行代码:
import csv matched_values = [] with open("your_dataset.csv", "r", encoding="utf-8") as f: csv_reader = csv.reader(f) # 读取第一行表头,即所有列名称 column_headers = next(csv_reader) # 构建列名->列索引的映射,快速匹配 col_index = {name.strip(): idx for idx, name in enumerate(column_headers)} for row in csv_reader: # 第一列为当前行的行名称 row_label = row[0].strip() # 匹配行名与列名 if row_label in col_index: target_idx = col_index[row_label] # 尝试将单元格值转为浮点数,无效值直接跳过 try: cell_num = float(row[target_idx]) matched_values.append(cell_num) except (ValueError, IndexError): continue # 计算平均值 average = sum(matched_values) / len(matched_values) if matched_values else 0
内容的提问来源于stack exchange,提问作者so.n
相关产品推荐
相关产品推荐

