如何通过循环逐次合并Pandas DataFrame为日期对齐的主DataFrame
循环清洗多标的数据后按日期对齐合并主DataFrame实现方案
最优方案:列表收集清洗结果后一次性合并
该方案性能最优,避免循环中反复修改DataFrame的额外开销,逻辑和非循环场景下的pd.concat写法完全一致,自动按日期索引对齐、缺失值填充NaN。
import pandas as pd def clean_func(tkr,f1): f1['Date'] = pd.to_datetime(f1['Date']) f1.index = f1['Date'] keep = ['Col1','Col2'] f2 = f1[keep] f2.columns = [tkr+'Col1',tkr+'Col2'] return f2 tkrs = ['tkr1','tkr2','tkr3'] # 初始化空列表,存储每个标的清洗完成后的DataFrame processed_dfs = [] for tkr in tkrs: df1 = pd.read_csv(f'C:\\path\\{tkr}.csv') df2 = clean_func(tkr, df1) processed_dfs.append(df2) # 沿列方向一次性合并,自动按日期索引对齐 combined = pd.concat(processed_dfs, axis=1)
核心特性
- 自动以DatetimeIndex为键做全外连接对齐,保留所有标的出现过的全部日期
- 标的缺失对应日期数据时,对应位置自动填充
NaN - 列名已在清洗阶段按标的代码重命名,合并后无列名冲突
- 标的数量较多时(百级以上)性能远高于逐次循环拼接
备选方案:循环内逐次拼接
如果循环过程中需要对已合并的主表做增量处理,可以用join逐次追加新标的数据:
import pandas as pd def clean_func(tkr,f1): f1['Date'] = pd.to_datetime(f1['Date']) f1.index = f1['Date'] keep = ['Col1','Col2'] f2 = f1[keep] f2.columns = [tkr+'Col1',tkr+'Col2'] return f2 tkrs = ['tkr1','tkr2','tkr3'] # 初始化空主表 combined = pd.DataFrame() for tkr in tkrs: df1 = pd.read_csv(f'C:\\path\\{tkr}.csv') df2 = clean_func(tkr, df1) if combined.empty: combined = df2 else: # how='outer' 保留所有日期,缺失值自动填充NaN combined = combined.join(df2, how='outer')
注意:非必要不选该方案,逐次拼接会反复复制全量主表数据,数据量较大时运行效率会明显降低。
内容的提问来源于stack exchange,提问作者GC123
相关产品推荐
相关产品推荐

