多次索引熊猫数据帧的更快方法

时间:2020-04-23 12:08:19

标签: python pandas

对于df_a中的每一行,我正在寻找df_b中ID相同的行,并且

df_a看起来像:

[(2, 4, 6), (3, 3, 6), (4, 4, 4)]

df_b看起来像:

|---------------------|------------------|------------------|
|      Name           |     id           |     location     |
|---------------------|------------------|------------------|
|          a          |         1        |       202013     |
|---------------------|------------------|------------------|

不幸的是,df_a和df_b都接近一百万行。此代码大约需要10个小时才能在我的本地计算机上运行。目前,我正在运行以下内容:

|---------------------|------------------|------------------|------------------|
|      Name           |     id           |  location_start  |  location_end    |
|---------------------|------------------|------------------|------------------|
|          x          |         1        |       202010     |       2020199    |
|---------------------|------------------|------------------|------------------|

有什么明显的方法可以加快速度吗?

1 个答案:

答案 0 :(得分:1)

您可以这样做:

考虑以下示例数据帧:

In [90]: df_a = pd.DataFrame({'Name':['a','b'], 'id':[1,2], 'location':[202013, 102013]})                                                                                                                   

In [91]: df_b = pd.DataFrame({'Name':['a','b'], 'id':[1,2], 'location_start':[202010, 1020199],'location_end':[2020199, 1020299] })

In [92]: df_a                                                                                                                                                                                               
Out[92]: 
  Name  id  location
0    a   1    202013
1    b   2    102013

In [93]: df_b                                                                                                                                                                                               
Out[93]: 
  Name  id  location_start  location_end
0    a   1          202010       2020199
1    b   2         1020199       1020299

In [95]: d = pd.merge(df_a, df_b, on='id')

In [106]: indexes = d[d['location'].between(d['location_start'], d['location_end'])].index.tolist()                                                                                                         

In [107]: df_b.iloc[indexes, :]                                                                                                                                                                             
Out[107]: 
  Name  id  location_start  location_end
0    a   1          202010       2020199