Pandas «Group By» Запрос на большие данные в HDFStore?

У меня около 7 миллионов строк в HDFStore с более чем 60 столбцами. Данные больше, чем я могу вписаться в память. Я ищу для объединения данных в группы на основе значения столбца «А». Документация для pandas split / aggregating / DataFrame предполагает, что у меня есть все мои данные в DataFrame , но я не могу прочитать весь магазин в DataFrame в памяти. Каков правильный подход для группировки данных в HDFStore ?

  • Как повернуть рамку данных в Pandas?
  • преобразование данных в список
  • Значение доступа по местоположению в отсортированной серии panda с целым индексом
  • Добавление серии pandas с разными индексами без получения NaN
  • Разделите разные DataFrames на том же рисунке
  • Pandas pytable: как указать min_itemsize элементов MultiIndex
  • Python / pandas idiom для if / then / else
  • FailedPreconditionError: попытка использовать uninitialized в Tensorflow
  • как форматировать определенные ячейки в excel с помощью пакета xlsx в python
  • ImportError: Нет модуля с именем 'pandas'
  • Pandas DataFrame нарезка днем ​​/ часом / минутой
  • Переименование столбцов при использовании resample
  • One Solution collect form web for “Pandas «Group By» Запрос на большие данные в HDFStore?”

    Вот полный пример.

     import numpy as np import pandas as pd import os fname = 'groupby.h5' # create a frame df = pd.DataFrame({'A': ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'bar', 'foo', 'foo', 'foo'], 'B': ['one', 'one', 'one', 'two', 'one', 'one', 'one', 'two', 'two', 'two', 'one'], 'C': ['dull', 'dull', 'shiny', 'dull', 'dull', 'shiny', 'shiny', 'dull', 'shiny', 'shiny', 'shiny'], 'D': np.random.randn(11), 'E': np.random.randn(11), 'F': np.random.randn(11)}) # create the store and append, using data_columns where I possibily # could aggregate with pd.get_store(fname) as store: store.append('df',df,data_columns=['A','B','C']) print "store:\n%s" % store print "\ndf:\n%s" % store['df'] # get the groups groups = store.select_column('df','A').unique() print "\ngroups:%s" % groups # iterate over the groups and apply my operations l = [] for g in groups: grp = store.select('df',where = [ 'A=%s' % g ]) # this is a regular frame, aggregate however you would like l.append(grp[['D','E','F']].sum()) print "\nresult:\n%s" % pd.concat(l, keys = groups) os.remove(fname) 

    Вывод

     store: <class 'pandas.io.pytables.HDFStore'> File path: groupby.h5 /df frame_table (typ->appendable,nrows->11,ncols->6,indexers->[index],dc->[A,B,C]) df: ABCDEF 0 foo one dull -0.815212 -1.195488 -1.346980 1 foo one dull -1.111686 -1.814385 -0.974327 2 foo one shiny -1.069152 -1.926265 0.360318 3 foo two dull -0.472180 0.698369 -1.007010 4 bar one dull 1.329867 0.709621 1.877898 5 bar one shiny -0.962906 0.489594 -0.663068 6 bar one shiny -0.657922 -0.377705 0.065790 7 bar two dull -0.172245 1.694245 1.374189 8 foo two shiny -0.780877 -2.334895 -2.747404 9 foo two shiny -0.257413 0.577804 -0.159316 10 foo one shiny 0.737597 1.979373 -0.236070 groups:Index([bar, foo], dtype=object) result: bar D -0.463206 E 2.515754 F 2.654810 foo D -3.768923 E -4.015488 F -6.110789 dtype: float64 

    Некоторые оговорки:

    1) Эта методология имеет смысл, если плотность вашей группы относительно низкая. Порядка сотен или тысяч групп. Если вы получаете больше, чем более эффективные (но более сложные методы), и ваша функция, которую вы применяете (в данном случае sum ), становится более ограничительной.

    По сути, вы бы итератором по всему магазину кусками, группируясь по ходу дела, но сохраняя группы только полуразрушенными (представьте, что вы делаете среднее значение, поэтому вам нужно будет сохранить текущую общую сумму плюс текущее количество, а затем разделите в конце) , Таким образом, некоторые операции будут немного сложнее, но могут потенциально обрабатывать МНОГИЕ группы (и очень быстро).

    2) эффективность этого может быть улучшена за счет сохранения координат (например, местоположения групп, но это немного сложнее)

    3) с этой схемой невозможна мультигруппа (это возможно, но требует более приближенного подхода 2) выше

    4) столбцы, которые вы хотите сгруппировать, ДОЛЖНЫ быть data_column!

    5) вы можете комбинировать любой другой фильтр, который вы пожелаете, в выбранном btw (который является чистым способом многопользовательской связи, вы просто формируете 2 уникальных списка группы и итератора над их продуктом, а не очень эффективно, если у вас есть партии групп, но может работать)

    НТН

    дайте мне знать, если это сработает для вас

    Python - лучший язык программирования в мире.