关于Pandas允许重复列及拆分特殊格式股票财务数据CSV的技术问询
嘿,这个类透视表格式的股票财务CSV拆分确实有点绕,我之前处理过类似的报表数据,给你一套实操方案试试!
处理特殊类透视表CSV的拆分方案
首先先明确咱们要搞定的这个CSV的核心特点,避免走弯路:
- 首列前若干行是全局元信息(比如报表周期、统计口径这类表头内容)
- 后续列中,公司名称、ID等标识会重复出现(因为单公司对应多属性行,不是一公司一列的结构)
- 跳过首列的前几行后,剩余部分趋近于常规DataFrame,但真正的数据表头是嵌在某一行中的
下面用Python的pandas来实现拆分,步骤清晰好调整:
1. 读取原始文件(保留所有行)
因为前几行的全局信息不能丢,所以先不设置表头,把所有内容读进来:
import pandas as pd # 读取整个文件,不指定表头 df_raw = pd.read_csv('large_stock_finance.csv', header=None)
2. 提取全局表头信息
假设首列前3行是全局信息(比如第0行是报表年份,第1行是数据类型,第2行是备注),你可以根据实际文件调整行数:
# 提取首列前3行的全局内容 global_meta = df_raw.iloc[0:3, 0].tolist() # 可以先打印确认下 print("全局元信息:", global_meta)
3. 定位数据区域与表头
找到真正的数据表头所在行,以及实际数据的起始行。比如假设第3行(索引从0开始)是数据的表头行,第4行开始是实际数据:
# 数据表头所在行的索引 data_header_idx = 3 # 实际数据起始行 data_start_idx = data_header_idx + 1 # 提取数据部分并设置表头 df_data = df_raw.iloc[data_start_idx:, :] df_data.columns = df_raw.iloc[data_header_idx, :].tolist()
4. 按公司维度拆分数据块
因为公司信息是重复出现的,我们按公司ID(或名称)分组,把每个公司的数据存为单独的CSV,同时带上之前提取的全局元信息:
# 假设用于分组的列是'Company_ID',换成你实际的列名 company_groups = df_data.groupby('Company_ID') # 遍历每个分组,生成单独的CSV文件 for comp_id, comp_df in company_groups: # 生成文件名,比如按公司ID命名 output_file = f"stock_finance_comp_{comp_id}.csv" # 写入文件:先写全局元信息,再写数据 with open(output_file, 'w', newline='', encoding='utf-8') as f: # 逐行写入全局元信息 for meta_line in global_meta: f.write(f"{meta_line}\n") # 写入数据(包含表头) comp_df.to_csv(f, index=False)
额外优化:处理超大型文件
如果文件大到内存扛不住,用chunksize分批读取处理,避免内存溢出:
chunk_size = 10000 # 每次读1万行,可调整 for chunk in pd.read_csv('large_stock_finance.csv', header=None, chunksize=chunk_size): # 对每个chunk重复上述步骤:提取元信息(注意只有第一个chunk需要提取全局元)、定位数据、分组保存 # 这里需要加个判断,只从第一个chunk提取全局元 pass
注意事项
- 一定要根据你的实际CSV结构调整行索引、列名这些参数,先打印几行
df_raw确认结构再动手 - 如果没有公司ID,用
Company_Name分组也可以,但要注意名称重复的情况 - 字符编码如果有问题,在
read_csv和open的时候指定encoding='gbk'或其他合适的编码
内容的提问来源于stack exchange,提问作者Tanzir Rahman
相关产品推荐
相关产品推荐

