为啥我的 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 循环覆盖而不是追加?的主要内容,如果未能解决你的问题,请参考以下文章
createBlockBlobFromStream() 覆盖现有内容而不是追加
如何在 Power BI 中为查询建模以每天追加新数据而不是覆盖