如何使用pandas的merge功能将多支股票CSV文件合并为目标DataFrame
完全可以用merge功能实现,pandas的merge支持两两DataFrame合并,配合functools.reduce即可实现多个DataFrame的迭代合并,内连接的合并逻辑也正好匹配你要求的「仅保留所有股票共有日期交集」的规则,具体操作如下:
实现步骤
- 导入依赖库,读取目标文件夹下的所有csv文件
import pandas as pd import os from functools import reduce # 替换为你存放csv文件的文件夹路径 csv_folder = "./stock_data" # 获取所有csv格式文件 csv_list = [f for f in os.listdir(csv_folder) if f.endswith(".csv")]
- 逐个读取csv文件,计算单只股票的收益率,整理为待合并的结构
df_list = [] for csv_file in csv_list: # 从文件名提取股票代码 symbol = csv_file.replace(".csv", "") # 读取csv并自动解析日期列为datetime格式 stock_df = pd.read_csv(os.path.join(csv_folder, csv_file), parse_dates=["Date"]) # 基于复权收盘价计算单日收益率,可根据需求调整收益率计算规则 stock_df[symbol] = stock_df["Adj Close"].pct_change() # 仅保留后续合并需要的日期列、收益率列 df_list.append(stock_df[["Date", symbol]])
- 迭代merge所有DataFrame得到最终结果
# 以Date为关联键,用内连接合并,自动保留所有股票共有的日期交集 final_df = reduce( lambda left_df, right_df: pd.merge(left_df, right_df, on="Date", how="inner"), df_list )
结果说明
最终得到的final_df结构完全符合你的要求:
- 第一列为
Date日期列 - 剩余100列对应每个股票代码,列值为对应股票的收益率
- 所有行的日期都是100只股票共同存在的交集日期
内容的提问来源于stack exchange,提问作者Redman
相关产品推荐
相关产品推荐

