python axis 0_python – 为什么pd.concat({},axis = 1)比pd.concat({},axis = 0)慢.unstack(0)?

快速分析表明,pd.Index.union会消耗pd.concat(dict_of_series,axis = 1)调用中的大量时间.它在内部函数_union_indexes中逐个调用每个索引 – 类似于下面的函数union.

另一方面,pd.concat(dict_of_series,axis = 0).unstack(0)使用了一些聪明的优化,我没有尝试分析.无论如何,那里没有调用_union_indexes甚至pd.Index.union.

‘_union_indexes’会成为罪魁祸首吗?很可能.我只拿了索引:

idxs = [d.index for d in dict_of_series.values()]

并比较了以下两个功能:

def union(idxs):

ans = pd.Index([])

for idx in idxs:

ans = ans.union(idx)

return ans

def union_multi(idxs):

arr0 = np.concatenate(idxs)

arr1 = np.zeros(arr0.size)

ans = pd.MultiIndex.from_arrays([arr0, arr1])

return ans.levels[0]

union是_union_indexes的等价物,而union_multi有一些多索引开销,但避免调用pd.Index.union.

我粗略的时间:

>>> %timeit -n1 -r1 pd.concat(dict_of_series, axis=1)

1 loop, best of 1: 82.9 ms per loop

>>> %timeit -n1 -r1 pd.concat(dict_of_series, axis=0).unstack(0)

1 loop, best of 1: 57.9 ms per loop

>>> %timeit -n1 -r1 union(idxs)

1 loop, best of 1: 32.8 ms per loop

>>> %timeit -n1 -r1 union_multi(idxs)

1 loop, best of 1: 12.5 ms per loop

一个简单的pd.Index(np.unique(np.concatenate(idxs)))稍微快一点,但它不适用于混合类型.

(顺便说一下,只有当所有索引都是唯一的时,pd.concat才有效.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值