假设这是我的数据框。这是销售数据。
date date_block_num shop_id item_id item_price item_cnt_day
0 2013-01-02 0 59 22154 999.00 1.00
1 2013-01-03 0 25 2552 899.00 1.00
2 2013-01-05 1 25 2552 899.00 -1.00
3 2013-01-06 2 25 2554 1709.05 1.00
4 2013-01-15 2 28 2555 1099.00 1.00
5 2013-01-10 3 25 2564 349.00 1.00
6 2013-01-02 3 26 2565 549.00 1.00
7 2013-01-04 3 25 2572 239.00 1.00
8 2013-01-11 4 25 2572 299.00 1.00
9 2013-01-03 4 27 2573 299.00 3.00
因此,我试图获得与shop_id
列有关的所有{strong>组合或成对的item_id
date_block_num
,如下所示。
matrix = []
for i in range(5):
sale = sales[sales.date_block_num==i]
matrix.append(np.array(list(itertools.product([i], sales.shop_id.unique(), sales.item_id.unique())), dtype='int16'))
df = pd.DataFrame(np.vstack(matrix)) #This works but it's slow.
在编写没有循环的相同代码方面的任何帮助。
我试图做这样的事情,但是它太慢了,当我将其转换为原始数据集上的数据帧时会返回内存错误。
from itertools import product
df = pd.DataFrame(list(product(sales.date_block_num.unique(), sales.shop_id.unique(), sales.item_id.unique())))
注意:原始数据集有超过一百万行。
答案 0 :(得分:2)
您可以尝试使用笛卡尔积的Pandas实现:
cartesian = pd.core.reshape.util.cartesian_product
cart_cols = ['date_block_num', 'shop_id', 'item_id']
date, shop, item = cartesian([df[col].unique() for col in cart_cols])
res = pd.DataFrame({'date_block_num': date, 'shop': shop,'item': item})