【问题标题】:Why is my for loop overwriting instead of appending?为什么我的 for 循环覆盖而不是追加?
【发布时间】:2017-11-11 21:28:14
【问题描述】:

我尝试将多个 (25k) .csv 文件附加到 HDFStore 文件中。它们都共享相同的标题。我正在使用下面的代码,但由于某种原因,每当我运行它时,数据框并没有附加所有文件,而只是列表中的最后一个文件。

filenames = []  #list of .csv file paths that I've alredy populated
dtypes= {dict of datatypes}
store = pd.HDFStore('store.h5')
store.put('df', pd.read_csv(filenames[0],dtype=dtypes,parse_dates=
["date"])) #store one data frame

for f in filenames:
    try:
        temp_csv = pd.DataFrame()
        temp_csv = pd.read_csv(f,dtype=dtypes,parse_dates=["trade_date"]) 
        store.append('df', temp_csv)
    except:
    pass

我尝试使用文件名列表的一个子集,但总是得到最后一个条目。出于某种原因,循环不是附加我的文件,而是每次都覆盖它。任何建议将不胜感激,因为这让我发疯。 (python 3, windows)

【问题讨论】:

  • 如果你不必用pandas做,你可以用普通的pythonopen命令做。看看这个link
  • 感谢您的建议 - 我会尝试一下。我正在使用这种方法,因为 csv 文件每个都有大约 100k 行,其中有 25k。当我尝试只使用数据帧而不是 hdf 文件时,我的计算机一直在崩溃,因为数据集太大了。
  • Catch all except 很少是个好主意。你的 except: pass 隐藏了什么?

标签: python csv pandas append hdfstore


【解决方案1】:

我认为问题与:

store.append('df', temp_csv)

如果我正确理解您要执行的操作,“df”应该每次迭代都会改变,您现在只是覆盖它。

【讨论】:

【解决方案2】:

就像@SeaMonkey 所说的那样,您每次迭代都会创建/存储一个新的 DataFrame。你的合并数据框应该在你的循环之外实例化,就像这样。

filenames = []  #list of .csv file paths that I've alredy populated
dtypes= {dict of datatypes}

df = pd.DataFrame()
for f in filenames:
    df_tmp = pd.read_csv(f,dtype=dtypes,parse_dates=["trade_date"]) 
    df = df.append(df_tmp)

store = pd.HDFStore('store.h5')
store.put('df', df)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2023-04-04
    • 1970-01-01
    • 2016-06-19
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多