Python读取Azure存储多JSON文件时如何拼接合并pandas DataFrame
问题原因
你的代码有两个核心问题:
- 循环读取每个blob文件时,每次都直接对
df变量重新赋值,循环结束后df仅保存最后一个读取到的JSON文件的数据,根本没有完成多文件数据合并。 - 从你输出的DataFrame元信息可以看到,部分文件的列名带隐藏的首尾空格(比如第一份数据的
Date列名后多了空格),列名不匹配会导致过滤条件无法命中对应值,返回空结果。
修复方案
按以下逻辑调整代码即可完成所有文件数据的拼接,同时解决过滤失效问题:
- 循环开始前初始化一个空列表,临时存储每个单文件读取生成的DataFrame
- 读取每个文件生成临时df后,先清洗列名,去掉所有列名的首尾空白字符
- 所有文件读取完成后,用
pandas.concat一次性合并所有临时df,得到完整的总数据集 - 做日期类过滤前,先把Date列转为标准datetime格式,避免字符串匹配异常
修复后完整代码
from azure.storage.blob import BlobServiceClient, ContainerClient import json import pandas as pd from datetime import datetime import uuid connect_str = "" blob_service_client = BlobServiceClient.from_connection_string(connect_str) container_name = "raw" container_client = blob_service_client.get_container_client(container_name) blob_list = container_client.list_blobs(name_starts_with="path") # 初始化列表存每个文件的临时df df_list = [] for blob in blob_list: blob_client = container_client.get_blob_client(blob) streamdownloader = blob_client.download_blob() file_data = json.loads(streamdownloader.readall()) temp_df = pd.DataFrame(file_data) # 清洗列名,去掉首尾空格 temp_df.columns = temp_df.columns.str.strip() df_list.append(temp_df) # 合并所有数据 final_df = pd.concat(df_list, ignore_index=True) # 可选:把Date列转成日期格式,方便后续过滤 final_df['Date'] = pd.to_datetime(final_df['Date'], format="%d-%b-%Y") # 现在可以正常执行过滤操作,比如过滤6月15日的数据 filter_result = final_df[final_df['Date'] == "2022-06-15"] print(filter_result)
注意:如果你的路径下存在非JSON格式的blob文件,需要在循环里加异常捕获,避免读取报错中断。
内容的提问来源于stack exchange,提问作者SanjanaSanju
相关产品推荐
相关产品推荐

