如何向量化我的代码并获得所有唯一对

时间:2018-11-20 21:08:48

标签: python python-3.x pandas

假设这是我的数据框。这是销售数据。

        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())))

注意:原始数据集有超过一百万行。

1 个答案:

答案 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})