Панды сгруппировать два кадра данных без слияния - PullRequest
0 голосов
/ 27 августа 2018

У меня есть два не объединяемых DataFrame.Фактически, выполнение некоторых преобразований может сделать их объединяемыми, но будет стоить намного больше памяти.

Два индекса данных - это DatatimeIndex, но они не равны.У них обоих есть столбцы product_id и store_id.Я хочу выбрать строки с одинаковыми product_id и store_id в двух кадрах данных и выполнить процесс.

Мой текущий рабочий код:

with tqdm(total=product_ids.shape[0]*store_ids.shape[0]) as t:
    for product_id in product_ids:
        p1 = df1.loc[(df1.product_id==product_id)]
        p2 = df2.loc[(df2.product_id==product_id)]
        for store_id in store_ids:
            df_oi = p1.loc[(p1.store_id==store_id)]

            t.update()

            if df_oi.shape[0] < 14:
                continue

            df_sql = p2.loc[(p2.store_id==store_id)]

            train_predict(df_oi, df_sql)


def train_predict(df_orderitems, df_stockquantitylog):

    store_id = df_orderitems.store_id[0]
    product_id = df_orderitems.product_id[0]

    s = df_stockquantitylog.resample('T').ffill().resample('H').sum()
    daily_stockout_hour = stack_index_to_hour_columns(s, hours=range(7, 21))

    daily_orderitems = resample_orderitems_by_day(df_orderitems)

    if daily_orderitems.shape[0] < 30:
        return

    df_userstat = read_today_userstat(db, store_id, start_date)

    if (daily_orderitems.index[-1] - df_userstat.index[0]).days < 30:
        return

    df = daily_orderitems.join(daily_stockout_hour)  
    ....
    ....

Как видите, я преобразую вtrain_predict, что может значительно уменьшить использование памяти.Но здесь слишком много вариантов, которые делают мою программу очень медленной, а групповая работа более эффективна.


Теперь я пишу код как

g1 = df1.groupby(['product_id', 'store_id'])
g2 = df2.groupby(['product_id', 'store_id'])
g2dict = dict(i for i in g2)

def train_predict_sale_count(df_orderitems):
    store_id = df_orderitems.store_id[0]
    product_id = df_orderitems.product_id[0]
    df_stockquantitylog = g2dict[(product_id, store_id)]
    ...
    ...

tqdm.pandas()
g1.progress_apply(train_predict_sale_count) # progressbar is also efficient write use progress_apply. 

Это хорошо, но не моя цель.

Нужно заметить, что zip не работает:

for p1, p2 in zip(g1, g2):
    func(p1[1], p2[1]) 

Потому что здесь p1[0] != p2[0].p1[0] это ключ [store_id, product_id], мне нужно p1[0] равно p2[0]

Так как мне сгруппировать два кадра данных без объединения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...