Сгруппируйте и объедините фрейм данных, используя Vaex - PullRequest
1 голос
/ 26 июня 2019

У меня есть большой .csv файл с примерно 150M строк. Я все еще могу поместить весь набор данных в память и использовать панд для группировки и объединения. Пример ...

aggregated_df = df.groupby(["business_partner", "contract_account"]).sum()

В приведенном выше примере кадр данных содержит два целочисленных столбца, business_partner и contract_account, которые используются в качестве ключей для операции группировки. Можно предположить, что все остальные столбцы являются объектами с плавающей запятой, которые я хотел бы объединить.

Однако на моей рабочей станции используется только 1 из 48 ядер. Я пытаюсь использовать vaex , чтобы воспользоваться всеми моими ядрами, но не могу понять вызовы API для выполнения группового объединения и объединения. Возможно, это еще не возможно в Vaex?

Edit (ы):

  1. Я знаю, что эту операцию можно выполнить в темноте, но для этого вопроса я хочу сосредоточиться на Vaex.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Рабочий пример вы можете найти в https://docs.vaex.io/en/latest/api.html#vaex.dataframe.DataFrameLocal.groupby

В соответствии с вашим примером группировки по 2 столбцам и получения суммирования:

import pandas as pd, numpy as np
import vaex

# Create input dataframe

n=10**6  # Change this to adjust df size

a_c1 = [1,2,3]*n
a_c2 = [1,1,2,2,3,3]*int(n/2)
a_x = np.arange(float(len(a_c1)))
df = pd.DataFrame({'c1':a_c1,'c2':a_c2,'x1':a_x, 'x2':a_x})

# Convert dataframe to vaex

# dfv = vaex.from_pandas(df) # This also works, but it's slower
dfv = vaex.from_arrays(c1=a_c1, c2=a_c2, x1=a_x, x2=a_x)

df_result1 = df.groupby(['c1','c2']).sum()
df_result2 = dfv.groupby(['c1','c2'],agg='sum')

Структура вывода будет немного отличаться:

> print(df_result1)

                 x1            x2
c1 c2                            
1  1   7.499985e+11  7.499985e+11
   2   7.500000e+11  7.500000e+11
2  1   7.499990e+11  7.499990e+11
   3   7.500005e+11  7.500005e+11
3  2   7.499995e+11  7.499995e+11
   3   7.500010e+11  7.500010e+11

> print(df_result2)

  #    c1    c2      x_1_sum      x_2_sum
  0     2     3  7.50000e+11  7.50000e+11
  1     2     1  7.49999e+11  7.49999e+11
  2     3     2  7.5e+11      7.5e+11
  3     3     3  7.50001e+11  7.50001e+11
  4     1     2  7.5e+11      7.5e+11
  5     1     1  7.49998e+11  7.49998e+11

0 голосов
/ 05 июля 2019

Насколько я знаю, вам нужно будет вручную настроить пределы и количество бинов для группировки - но аргумент 'binby' должен выполнить работу в vaex:

df.sum([list of columns you want summed],binby=["business_partner", "contract_account"],limits=['minmax','minmax'],
       shape=[business_partner_bins,contract_account_bins])

, если вы хотитесуммированные столбцы можно заменить [список суммируемых столбцов] на df.column_names

PS.Я только что заметил, что в vaex есть функция groupby, но у меня нет опыта ее использования.https://vaex.readthedocs.io/en/latest/api.html?highlight=groupby#vaex.dataframe.DataFrameLocal.groupby

...