You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:03:14