熊猫通过两个数据框分组而不合并

时间:2018-08-27 07:30:45

标签: python pandas pandas-groupby

我有两个无法合并的DataFrame。 实际上,进行一些转换可以使它们可合并,但是会花费更多的内存。

两个数据帧索引为DatatimeIndex,但不相等。它们都有列product_idstore_id。我想选择在两个数据帧中具有相同的product_idstore_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中进行了转换,这可以减少大量的内存使用。但是这里有太多选择,这使我的程序非常慢,groupby效率更高。


现在我写代码为

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]

那我如何在不合并的情况下对两个数据帧进行分组?

0 个答案:

没有答案