首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何向量化熊猫操作以提高速度?

如何向量化熊猫操作以提高速度?
EN

Stack Overflow用户
提问于 2019-04-25 04:54:36
回答 1查看 129关注 0票数 1

这是一个SKU亲和性问题。我有一个这样的数据帧。每个ctn_id都有多个sku_codes。

代码语言:javascript
复制
dfr = pd.DataFrame(columns=['ctn_id','sku_code'])
dfr['ctn_id'] = np.random.randint(low=1,high=21,size=200)
dfr['sku_code'] = np.random.choice(['a','b','c','d'],size=200)
dfr.drop_duplicates(['ctn_id','sku_code'], inplace=True)

我想填写以下数据帧。

代码语言:javascript
复制
dfx = pd.DataFrame(columns=['sku_code','a','b','c','d'])
dfx['sku_code'] = ['a','b','c','d']
dfx = dfx.fillna(0)
dfx.set_index('sku_code',inplace=True)

使用下面的逻辑

代码语言:javascript
复制
for idx in dfr['ctn_id'].unique():
    x = list(dfr[dfr['ctn_id'] == idx]['sku_code'].unique())
    for skui in dfx.index:
        if skui in x:
            for skuj in x:
                dfx.loc[skui, skuj] = dfx.loc[skui, skuj] + 1

我有250万的ctn_ids和400亿的sk_codes,总共有十亿次赋值操作。有没有更好的方法来使用pandas或任何其他包来做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-04-25 05:48:49

好吧,我会试一试。

我不确定这是否足够快,但我想说它已经比你的for循环快得多了。

它使用了一种老套的方式来执行“矢量化”的集合差异。

代码语言:javascript
复制
s = df.groupby(['sku_code']).ctn_id.agg(set)
pd.DataFrame(map(lambda s: list(map(len,s)), np.array(s) & np.array(s).reshape([-1,1])))

    0   1   2   3
0   18  17  18  16
1   17  19  19  17
2   18  19  20  17
3   16  17  17  17

使用您提供的示例,性能提高了大约100倍。

代码语言:javascript
复制
# your method
79.4 ms ± 3.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# my try
668 µs ± 30.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55838406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档