为啥我的 for 循环覆盖而不是追加?

Posted

技术标签:

【中文标题】为啥我的 for 循环覆盖而不是追加?【英文标题】: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 隐藏了什么? 【参考方案1】:

我认为问题与:

store.append('df', temp_csv)

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

【讨论】:

当我尝试做我的商店包含所有的 df 作为单独的文件。根据文档pandas.pydata.org/pandas-docs/stable/generated/…,第一个参数是键,第二个应该是值。除非我读错了。我还在研究此处找到的“表格格式”示例:pandas.pydata.org/pandas-docs/stable/io.html#io-hdf5。 问题是我不确定同一个键可以有两个值。我认为第一个被覆盖了【参考方案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)

【讨论】:

以上是关于为啥我的 for 循环覆盖而不是追加?的主要内容,如果未能解决你的问题,请参考以下文章

不能用swift在for循环中追加一个数组?

createBlockBlobFromStream() 覆盖现有内容而不是追加

FileWriter() 只会追加,不会覆盖

如何在 Power BI 中为查询建模以每天追加新数据而不是覆盖

labview中如何往tdms文件中数据追加数据,而不是覆盖源文件

for循环和追加的Python问题[重复]