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

如何合并文件夹内所有Parquet文件并保留对应元数据?

解决多Parquet文件合并并保留元数据的问题

核心问题分析

你之前的代码存在两个关键问题:

  • 元数据DataFrame(dff)只有1行,而文件数据DataFrame(df)有多行,直接横向合并会导致行数不匹配,元数据只会和第一行对齐,其余行对应列值为NaN
  • 循环中直接写入CSV时未正确初始化write_mode和write_header变量,且逐行追加不如先合并所有数据再一次性写入高效

修正后的完整代码

from pathlib import Path
import pandas as pd
import pyarrow.parquet as pq
import json

data_dir = Path(r'C:\python\Datas\parq\Merged')
processed_dfs = []

for parquet_path in data_dir.glob('*.parquet'):
    # 读取文件数据
    df = pd.read_parquet(parquet_path)
    # 读取并解析元数据
    pt = pq.read_table(parquet_path)
    meta_own = json.loads(pt.schema.metadata[b'ais'])
    meta_df = pd.json_normalize(meta_own)
    
    # 将元数据广播到和数据行一致的行数,确保每行都带上该文件的元数据
    # 方法1:重复元数据行(适用于嵌套元数据结构)
    meta_expanded = pd.concat([meta_df] * len(df), ignore_index=True)
    # 方法2:用assign直接添加列(更高效,适合扁平元数据结构)
    # meta_expanded = df.assign(**meta_df.iloc[0])
    
    # 合并数据和元数据
    merged_df = pd.concat([df, meta_expanded], axis=1)
    processed_dfs.append(merged_df)

# 合并所有处理后的DataFrame
full_df = pd.concat(processed_dfs, ignore_index=True)
# 保存到CSV
full_df.to_csv('merged_data_with_metadata.csv', index=False)

关键说明

  1. 元数据广播:每个Parquet文件的元数据是整个文件的属性,需要让文件内每一行都带上这些元数据,因此通过重复元数据行或assign方法,确保元数据列和数据行一一对应
  2. 批量合并:先把所有处理后的DataFrame存入列表,最后一次性合并,比循环中逐次追加CSV更高效,也避免了表头重复写入的问题
  3. 依赖补全:补充了pyarrow.parquet和json的导入,解决原代码中pq未定义的报错问题

内容的提问来源于stack exchange,提问作者Dein_coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:20:49