You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python csv或Pandas规范处理含单位行的CSV文件?

处理带单位行CSV的规范方法及Python实现

直接忽略第二行的单位信息太可惜了——单位是数据的关键附加属性,规范的处理应该把它和变量名绑定,或者单独存储为元数据,既能保留数据的实际含义,又不会干扰后续的数值计算。比如可以把列名改成z(cm)这种形式,或者用字典记录每个变量对应的单位。


用Python内置csv模块处理

步骤:

  1. 先读前两行:第一行拿变量名,第二行拿对应单位
  2. 把变量名和单位合并(注意处理重复的列名,比如原CSV里的两个error)
  3. 再读取后续的数值行,转成字典或列表方便使用

示例代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:55:14