Почему мой цикл for перезаписывается вместо добавления?

У меня есть несколько (25 КБ) файлов .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, окна)


person Aaron Pujanandez    schedule 09.06.2017    source источник
comment
Если вам не нужно делать это с помощью pandas, вы можете сделать это с помощью обычной команды python open. Взгляните на эту ссылку   -  person cookiedough    schedule 09.06.2017
comment
Спасибо за предложение. Я попробую. Я использую этот подход, потому что каждый файл csv имеет около 100 тыс. Строк, а их 25 тыс. Когда я пытался сделать это только с фреймом данных, а не с файлом hdf, мой компьютер продолжал давать сбой, потому что набор данных был слишком большим.   -  person Aaron Pujanandez    schedule 09.06.2017
comment
Поймать все кроме редко бывает хорошей идеей. Что скрывает ваш except: pass?   -  person JL Peyret    schedule 10.06.2017


Ответы (2)


Думаю, проблема связана с:

store.append('df', temp_csv)

Если я правильно понимаю, что вы пытаетесь сделать, df должен менять каждую итерацию, вы просто перезаписываете его сейчас.

person SeaMonkey    schedule 09.06.2017
comment
Когда я попытался сделать, мой магазин содержал все df в виде отдельных файлов. Согласно документации, pandas.pydata.org/pandas -docs / stable / generated /, первый параметр - это ключ, а второй - значение. Если только я не ошибаюсь. Я также работал над примером формата таблицы, найденным здесь: pandas .pydata.org / pandas-docs / stable / io.html # io-hdf5. - person Aaron Pujanandez; 09.06.2017
comment
Дело в том, что я не уверен, что у вас может быть два значения для одного и того же ключа. Я думаю, что первый перезаписан - person SeaMonkey; 09.06.2017

Вы создаете / сохраняете новый DataFrame с каждой итерацией, как сказал @SeaMonkey. Ваш консолидированный фрейм данных должен быть создан вне цикла, примерно так.

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)
person hobs    schedule 10.06.2017