2015-01-13 2 views
5

Я запускаю базовый скрипт, который перебирает через вложенный словарь, захватывает данные из каждой записи и добавляет его в Pandas DataFrame. Данные выглядят примерно так:Улучшить Row Append Performance On Pandas DataFrames

data = {"SomeCity": {"Date1": {record1, record2, record3, ...}, "Date2": {}, ...}, ...} 

Всего у него несколько миллионов записей. Сам скрипт выглядит так:

city = ["SomeCity"] 
df = DataFrame({}, columns=['Date', 'HouseID', 'Price']) 
for city in cities: 
    for dateRun in data[city]: 
     for record in data[city][dateRun]: 
      recSeries = Series([record['Timestamp'], 
           record['Id'], 
           record['Price']], 
           index = ['Date', 'HouseID', 'Price']) 
      FredDF = FredDF.append(recSeries, ignore_index=True) 

Это работает очень медленно, однако. Прежде чем искать способ распараллеливать его, я просто хочу удостовериться, что я не пропущу что-то очевидное, что сделало бы это быстрее, как я, поскольку я все еще новичок в Pandas.

+1

вы смотрели на [ 'from_dict'] (http://pandas.pydata.org/pandas-docs/ стабильный/генерироваться/pandas.DataFrame.from_dict.html # pandas.DataFrame.from_dict)? – EdChum

+4

Добавление строк в DataFrames по своей сути неэффективно. Попытайтесь создать весь DataFrame с его окончательным размером за один раз. Как говорит EdChum, в этом случае вы, вероятно, можете сделать это с помощью 'from_dict'. – BrenBarn

+0

Спасибо! Я попробую и посмотрю, как это работает. – Brideau

ответ

5

Используя предложение BrenBarn, я просто перестроил оригинальный словарь в новый словарь, который был отформатирован правильно, чтобы воспользоваться ожидаемой структурой from_dict. Реорганизация словаря была выполнена очень быстро, и тогда это просто вопрос вызова from_dict с этим новым словарем.

Все это происходило от загрузки данных до записи данных примерно за 12 секунд против первоначального часа или около того. Намного лучше!

2

Я столкнулся с аналогичной проблемой, когда мне приходилось многократно добавлять к DataFrame, но не знала значения перед добавлениями. Я написал легкую DataFrame, такую ​​как структура данных, которая является просто blists() под капотом. Я использую это, чтобы накапливать все данные, а затем, когда он полностью преобразует вывод в Pandas DataFrame. Вот ссылка на мой проект, все с открытым исходным кодом, так что я надеюсь, что это помогает другим:

https://pypi.python.org/pypi/raccoon