快速在numpy中进行索引搜索

时间:2020-06-25 20:16:19

标签: python pandas numpy

我正在寻找从一个数据框中获取值,然后根据索引将它们附加到另一个数据框中,并快速实现它。可以说我们有以下两个数据帧:

df有一堆带有城市作为列标题的随机数 df2是一个充满以(不重要)字母为标题的城市的数据框

df2的{​​{1}}位置,我们有df.loc[0,'c']。然后,我想转到Los Angeles并找到df列,并从Los Angeles索引中获取值,并将其附加到0上,使其读为{{1} }

df2

预期结果:

df3

Los Angeles : 544

我通过执行double for循环解决了此问题,但由于我的数据帧为(280k,260),因此花费了太长时间,因此我必须执行两次此功能。我正在寻找一种方法在numpy中做到这一点。理想情况下,如果我可以创建一个新的numpy数组,在其中它的数字在正确的索引位置中为字符串,并且我可以使用import pandas as pd import numpy as np np.random.seed(42) letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] cities = ['Minneapolis', 'Boston', 'Chicago', 'San Francisco', 'Los Angeles', 'Bozeman', 'New York', 'Austin', 'Dallas', 'New Orleans'] df = pd.DataFrame({city:np.random.randint(1, 1000, 10000) for city in cities}) df = df.astype(str) df2 = pd.DataFrame({k:[np.random.choice(cities) for i in range(10000)] for k in letters}) df Minneapolis Boston Chicago San Francisco Los Angeles 0 103 720 444 335 544 1 436 833 813 252 418 2 861 140 428 919 339 3 271 792 83 804 801 4 107 546 765 825 320 df2 a b c d e 0 San Francisco Minneapolis Los Angeles Chicago Los Angeles 1 Minneapolis San Francisco Los Angeles Chicago San Francisco 2 Minneapolis Los Angeles Boston Chicago Boston 3 Chicago Chicago Chicago Boston Los Angeles 4 San Francisco San Francisco San Francisco Boston Los Angeles 来将矩阵式单词和数字加在一起。只是想找出一种索引这些值的快速方法。

                        a                    b                    c  \
0     San Francisco : 335    Minneapolis : 103    Los Angeles : 544   
1       Minneapolis : 436  San Francisco : 252    Los Angeles : 418   
2       Minneapolis : 861    Los Angeles : 339         Boston : 140   
3            Chicago : 83         Chicago : 83         Chicago : 83   
4     San Francisco : 825  San Francisco : 825  San Francisco : 825  

1 个答案:

答案 0 :(得分:2)

您可以使用lookup

s = df2.stack().reset_index(name='val');
df2 + ' : ' + df.lookup(s['level_0'], s['val']).reshape(df2.shape)

在10000行数据上的执行时间为:

44 ms ± 1.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

截断数据的输出:

                     a                    b                    c  \
0  San Francisco : 335    Minneapolis : 103    Los Angeles : 544   
1    Minneapolis : 436  San Francisco : 252    Los Angeles : 418   
2    Minneapolis : 861    Los Angeles : 339         Boston : 140   
3         Chicago : 83         Chicago : 83         Chicago : 83   
4  San Francisco : 825  San Francisco : 825  San Francisco : 825   

               d                    e  
0  Chicago : 444    Los Angeles : 544  
1  Chicago : 813  San Francisco : 252  
2  Chicago : 428         Boston : 140  
3   Boston : 792    Los Angeles : 801  
4   Boston : 546    Los Angeles : 320  
相关问题