如何用Python csv或Pandas规范处理含单位行的CSV文件?
处理带单位行CSV的规范方法及Python实现
直接忽略第二行的单位信息太可惜了——单位是数据的关键附加属性,规范的处理应该把它和变量名绑定,或者单独存储为元数据,既能保留数据的实际含义,又不会干扰后续的数值计算。比如可以把列名改成z(cm)这种形式,或者用字典记录每个变量对应的单位。
用Python内置csv模块处理
步骤:
- 先读前两行:第一行拿变量名,第二行拿对应单位
- 把变量名和单位合并(注意处理重复的列名,比如原CSV里的两个
error) - 再读取后续的数值行,转成字典或列表方便使用
示例代码:
import csv # 打开CSV文件 with open('data.csv', 'r') as f: reader = csv.reader(f) # 读取变量名和单位行,去除多余空格 headers = [h.strip() for h in next(reader)] units = [u.strip() for u in next(reader)] # 合并变量名和单位,处理重复列名 combined_headers = [] for idx, (h, u) in enumerate(zip(headers, units)): if headers.count(h) > 1: # 重复列名加索引区分,比如error_0(dl) combined_headers.append(f"{h}_{idx}({u})") else: combined_headers.append(f"{h}({u})") # 读取数据并转成数值类型 data_list = [] for row in reader: numeric_row = [float(val.strip()) for val in row] data_list.append(dict(zip(combined_headers, numeric_row))) # 打印结果 for item in data_list: print(item)
用Pandas处理(更简洁)
Pandas处理这种带单位的CSV更高效,下面提供几种常用方式:
方式1:把单位嵌入列名
直接将单位合并到列名里,直观好认:
import pandas as pd # 读取前两行作为多级列头 df = pd.read_csv('data.csv', header=[0, 1]) # 合并成单级列名,格式为"变量(单位)" df.columns = [f"{col[0]}({col[1].strip()})" for col in df.columns] # 自动处理重复列名(比如两个error会变成error(dl)和error(dl).1) df.columns = pd.io.parsers.base_parser.ParserBase({'usecols': None})._maybe_dedup_names(df.columns) print(df)
方式2:单独存单位映射
不想改列名的话,把单位单独存成字典,后续需要时再调用:
import pandas as pd # 先读取前两行拿到变量名和单位 with open('data.csv', 'r') as f: headers = [h.strip() for h in f.readline().split(',')] units = [u.strip() for u in f.readline().split(',')] unit_map = dict(zip(headers, units)) # 从第三行开始读取数据 df = pd.read_csv('data.csv', skiprows=2, names=headers) print("数据内容:") print(df) print("\n各变量对应的单位:") print(unit_map)
方式3:保留多级列索引
如果想同时保留变量名和单位的层级关系,用多级列索引更清晰:
import pandas as pd # 直接读取前两行作为多级列索引 df = pd.read_csv('data.csv', header=[0, 1]) print("带层级的数据集:") print(df) # 示例:访问第一个error列(变量名error,单位dl) print("\n第一个error列的数据:") print(df[('error', 'dl')])
内容的提问来源于stack exchange,提问作者wander95
相关产品推荐
相关产品推荐

