我有两个无法合并的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
中进行了转换,这可以减少大量的内存使用。但是这里有太多选择,这使我的程序非常慢,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]
那我如何在不合并的情况下对两个数据帧进行分组?