如何将含嵌套数组的特殊格式CSV加载至Python Pandas DataFrame
解决Twitter特殊格式数据集加载到Pandas的方法
嘿,针对你这个Kaggle的Twitter数据集问题,我给你几个实用的方案,专门应对这种首行列标题、后续行是JSON数组的大文件场景:
方案一:逐行解析(内存友好,适合超大文件)
这种方法不会一次性把整个文件读进内存,逐行处理的方式对内存压力极小,特别适合规模超大的数据集:
import pandas as pd import json # 初始化存储数据的列表 data_rows = [] with open('twitter_dataset.csv', 'r', encoding='utf-8') as f: # 读取首行作为列标题,根据实际分隔符调整(比如逗号、制表符) column_names = f.readline().strip().split(',') # 逐行读取后续内容 for line in f: line = line.strip() if not line: # 跳过空行 continue # 解析JSON数组,捕获错误避免程序崩溃 try: row_data = json.loads(line) data_rows.append(row_data) except json.JSONDecodeError as e: print(f"解析行出错: {e},已跳过该行") # 转换为Pandas DataFrame df = pd.DataFrame(data_rows, columns=column_names)
方案二:Pandas快速读取+批量解析
如果文件规模没到极致,这个方法更简洁,利用Pandas先把每行读成字符串,再批量解析JSON:
import pandas as pd import json # 先把整个文件按行读取,首行作为临时列名 temp_df = pd.read_csv('twitter_dataset.csv', header=0, names=['json_content'], encoding='utf-8') # 解析每个JSON字符串为数组,再展开成DataFrame的列 df = temp_df['json_content'].apply(json.loads).apply(pd.Series) # 给DataFrame赋值正确的列标题 df.columns = temp_df.columns.tolist() # 替换成你实际读取的首行列标题列表
方案三:分块处理超大文件(平衡效率和内存)
如果文件大到连方案二都撑不住,就用Pandas的分块读取功能,每次处理一小部分数据:
import pandas as pd import json # 设定每次读取的行数,根据你的内存情况调整(比如10000行一块) chunk_size = 10000 final_df = pd.DataFrame() # 分块读取并处理文件 for chunk in pd.read_csv('twitter_dataset.csv', header=0, names=['json_content'], chunksize=chunk_size, encoding='utf-8'): # 解析当前块的JSON数据 parsed_chunk = chunk['json_content'].apply(json.loads).apply(pd.Series) # 拼接到最终DataFrame final_df = pd.concat([final_df, parsed_chunk], ignore_index=True) # 赋值正确的列标题 final_df.columns = column_names # column_names是之前读取的首行列标题列表
额外注意点
- 一定要确认首行的列标题数量和每行JSON数组的元素数量完全对应,不然会出现列不匹配的问题
- 如果文件有特殊编码(比如带BOM的UTF-8),记得在
open或read_csv里指定encoding='utf-8-sig' - 遇到解析错误的行,可以根据需求选择跳过或者记录错误日志,避免整个程序崩溃
内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

