多CSV文件第一列循环合并及DataFrame存储访问合并问题求助
嘿,我来帮你搞定这个CSV循环处理的问题,咱们一步步来拆解优化~
CSV循环导入、存储与列合并解决方案
一、先解决DataFrame的存储与访问问题
你现在的代码里每次循环都会把变量c覆盖,导致之前导入的DataFrame都丢失了,根本没法后续合并。咱们可以用列表或字典来存储所有导入的DataFrame,方便后续访问和操作:
方式1:用列表存储(适合按顺序访问)
import pandas as pd import datetime import os # 初始化空列表,用来存所有每天的DataFrame df_list = [] for s in range(40): # 生成历史工作日(这部分逻辑保留) ago_Ybd_0 = date_by_adding_business_days(datetime.date(2020,7,17), s, Holiday) year_0, month_0, day_0 = ago_Ybd_0.strftime("%Y-%b-%d").split("-") month_0 = month_0.upper() # 统一文件名(注意你原来的wget文件名和后续定义的文件名不匹配,这里要核对真实格式!) zip_filename = f'uk{day_0}{month_0}{year_0}kp.csv.zip' csv_filename = f'uk{day_0}{month_0}{year_0}kp.csv' # 下载和解压文件 !wget f'https://www.ukp.com/content/historical/{year_0}/{month_0}/cm{day_0} {month_0}{year_0}kp.csv.zip' -O {zip_filename} !unzip {zip_filename} # 读取CSV并存入列表 daily_df = pd.read_csv(csv_filename, engine='python') df_list.append(daily_df) # 清理临时文件(可选,节省磁盘空间) os.remove(zip_filename) os.remove(csv_filename)
之后要访问第n天的DataFrame,直接用df_list[n]就行(n从0开始)。
方式2:用字典存储(适合按日期快速访问)
如果需要按日期快速定位某一天的数据,用字典更方便,把日期字符串作为键:
df_dict = {} for s in range(40): # 日期生成逻辑不变 date_str = f'{day_0}{month_0}{year_0}' # 下载、解压、读取CSV逻辑同上 daily_df = pd.read_csv(csv_filename, engine='python') df_dict[date_str] = daily_df
比如要访问2020年7月17日的数据,就用df_dict['17JUL2020']。
二、按第一列(SYSTEM)执行列合并
你原来写的c.merge(c,on='SYSTEM',how='left')是把同一个DataFrame和自己合并,这显然不是你要的效果。咱们要把所有导入的DataFrame按SYSTEM列横向合并,把每天的数据列拼在一起:
方法1:用concat快速合并(推荐,适合数据量不大的情况)
如果所有DataFrame的SYSTEM列覆盖的内容差不多,用pd.concat效率最高:
# 把每个DataFrame的索引设为SYSTEM,然后横向拼接所有列 merged_df = pd.concat( [df.set_index('SYSTEM') for df in df_list], axis=1, # 横向拼接(列合并) join='outer' # 保留所有出现过的SYSTEM值,缺失值用NaN填充;如果只保留共同值用join='inner' ).reset_index() # 把SYSTEM重新变回普通列
方法2:循环逐步合并(适合需要自定义合并逻辑的情况)
如果需要更精细地控制合并过程(比如每次合并都处理重复列名),可以循环合并:
# 取第一个DataFrame作为初始合并结果 merged_df = df_list[0].copy() # 循环合并剩下的DataFrame for idx, df in enumerate(df_list[1:], start=1): # 用suffixes区分不同日期的同名列,比如PRICE会变成PRICE和PRICE_1、PRICE_2... merged_df = merged_df.merge( df, on='SYSTEM', how='left', suffixes=('', f'_day{idx}') )
三、你原代码里的几个小坑要注意
- 文件名不匹配:你原代码中
wget的文件名是cm{day_0} {month_0}{year_0}kp.csv.zip,但后面定义的a_0是uk开头的,这会导致读取CSV失败,一定要核对真实的文件命名格式! - 变量重复赋值:你先把
c赋值为日期字符串,又马上把它改成DataFrame,变量被覆盖了,后续没法复用日期字符串,建议用不同的变量名(比如我上面用的daily_df)。 - 临时文件堆积:下载和解压后的文件如果不需要保留,记得删掉,不然几百个文件会占满磁盘。
内容的提问来源于stack exchange,提问作者akhil kn
相关产品推荐
相关产品推荐

