加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 加速pandas应用或使用地图

发布时间:2020-12-20 12:00:38 所属栏目:Python 来源:网络整理
导读:我有一个DataFrame,我想基于查找表填充一个新列.我不能使用map,因为查找表中的值需要很多索引. import pandas as pdimport numpy as npd = pd.DataFrame({'I': np.random.randint(3,size=5),'B0': np.random.choice([True,False],5),'B1': np.random.choice(
我有一个DataFrame,我想基于查找表填充一个新列.我不能使用map,因为查找表中的值需要很多索引.

import pandas as pd
import numpy as np

d = pd.DataFrame({'I': np.random.randint(3,size=5),'B0': np.random.choice([True,False],5),'B1': np.random.choice([True,5)})

这是我的数据(实际上我的数据要大得多):

B0     B1  I
0   True  False  0
1  False  False  0
2  False  False  1
3   True  False  1
4  False   True  2

那我的查找表:

l = pd.DataFrame({(True,True): [1.1,2.2,3.3],(True,False): [1.3,2.1,3.1],(False,True): [1.2,False): [1.1,2.0,5.1]}
             )
l.index.name = 'I'
l.columns.names = 'B0','B1'
l = l.stack(['B0','B1'])

是的

I  B0     B1   
0  False  False    1.1
          True     1.2
   True   False    1.3
          True     1.1
1  False  False    2.0
          True     2.1
   True   False    2.1
          True     2.2
2  False  False    5.1
          True     3.1
   True   False    3.1
          True     3.3

所以我想从我的数据中添加一列w,查询值(I,B0,B1)的循环表.我正在使用申请:

d['w'] = d.apply(lambda x: l[x['I'],x['B0'],x['B1']],axis=1)

它有效:

B0     B1  I    w
0   True  False  0  1.3
1  False  False  0  1.1
2  False  False  1  2.0
3   True  False  1  2.1
4  False   True  2  3.1

问题是它非常慢.如何加快这个?

解决方法

这应该更快

find_these = list(zip(d.I,d.B0,d.B1))
d.assign(w=l.loc[find_these].values)

      B0     B1  I    w
0   True  False  0  1.3
1  False  False  0  1.1
2  False  False  1  2.0
3   True  False  1  2.1
4  False   True  2  3.1

加入

d.join(l.rename('w'),on=['I','B0','B1'])


      B0     B1  I    w
0   True  False  0  1.3
1  False  False  0  1.1
2  False  False  1  2.0
3   True  False  1  2.1
4  False   True  2  3.1

定时
小数据

%%timeit
find_these = list(zip(d.I,d.B1))
d.assign(w=l.loc[find_these].values)
100 loops,best of 3: 1.98 ms per loop

%timeit d.assign(w=d.apply(lambda x: l[x['I'],axis=1))
100 loops,best of 3: 11.8 ms per loop

%timeit d.join(l.rename('w'),'B1'])
100 loops,best of 3: 1.99 ms per loop

%timeit d.merge(l.reset_index())
100 loops,best of 3: 2.89 ms per loop

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读