常见的结构化数据 转化为 字典列表

以下是针对 CSV、Parquet、Excel 等格式使用 ​pandas 统一处理,并将每一行转换为字典的整理方案:

一、通用处理逻辑
无论何种数据格式,核心步骤均为:

用 pandas 读取为 DataFrame
将 DataFrame 转换为 列表 + 字典 格式(orient=‘records’)
二、具体实现代码

  1. CSV → 字典列表
import pandas as pd

# 读取CSV
df = pd.read_csv('data.csv', sep=',', encoding='utf-8')

# 转换为每行一个字典的列表
dict_list = df.to_dict(orient='records')

# 输出示例:
# [{'column1': value1, 'column2': value2}, ...]
print(dict_list)
  1. Parquet → 字典列表
import pandas as pd

# 读取Parquet(需安装pyarrow或fastparquet)
df = pd.read_parquet('data.parquet', engine='pyarrow') 

# 转换为字典列表
dict_list = df.to_dict(orient='records')
  1. Excel → 字典列表
import pandas as pd

# 读取Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 转换为字典列表
dict_list = df.to_dict(orient='records')
  1. HDF5 → 字典列表
import pandas as pd

# 读取HDF5
df = pd.read_hdf('data.h5', key='dataset')

# 转换为字典列表
dict_list = df.to_dict(orient='records')
  1. Jsonl→ 字典列表
import pandas as pd

# 读取 JSONL 为 DataFrame
df = pd.read_json('input.jsonl', lines=True)  # lines=True 是关键参数

# 转换为字典列表
json_data = df.to_dict(orient='records')

# 写入文件
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(json_data, f, indent=2, ensure_ascii=False)

三、关键参数说明

数据格式 核心方法 常用参数
CSV pd.read_csv() sep, header, names, dtype
Parquet pd.read_parquet() enginepyarrowfastparquet
Excel pd.read_excel() sheet_name, usecols, skiprows
HDF5 pd.read_hdf() key(数据集名称), mode
Jsonl pd.read_json lines

四、注意事项

  1. ​数据类型问题
    日期时间、NaN空值等会被保留为 pandas 原生类型(如 pd.Timestamp、np.nan)
    ​若需要纯原生Python类型,可手动转换:
import json
from datetime import date, datetime

def convert_dtypes(obj):
    if isinstance(obj, (datetime, date)):
        return obj.isoformat()
    elif pd.isna(obj):
        return None
    return obj

dict_list_clean = [
    {k: convert_dtypes(v) for k, v in row.items()} 
    for row in dict_list
]
  1. ​缺失值处理
    pandas 默认将缺失值转换为 NaN,但在字典中会以np.nan形式存在
    可通过 df.fillna(value) 填充缺失值后再转换
  2. ​性能优化
    大文件避免直接转换为字典列表(内存消耗高),建议分块处理:
# 分块读取CSV示例
chunk_size = 10000
for chunk in pd.read_csv('large.csv', chunksize=chunk_size):
    chunk_dict = chunk.to_dict(orient='records')
    # 逐块处理...
  1. ​编码与格式
    非UTF-8编码文件需指定encoding 参数(如 encoding='gbk'
    Parquet 文件需要确保列名合法(无特殊字符)

你可能感兴趣的:(python)