两个熊猫数据帧的行比较,以提取匹配的结果

时间:2020-06-11 21:48:20

标签: python pandas dataframe rowwise

我有一个名为df_ref的熊猫DataFrame,就像:

    a                   b               c               result
0   (-0.001, 0.00482]   (-0.001, 1.0]   (-0.001, 1.0]   0.622745
1   (-0.001, 0.00482]   (-0.001, 1.0]   (-0.001, 1.0]   0.450869
2   (-0.001, 0.00482]   (-0.001, 1.0]   (1.0, 5.0]      0.693840
3   (-0.001, 0.00482]   (-0.001, 1.0]   (1.0, 5.0]      0.484881
4   (-0.001, 0.00482]   (-0.001, 1.0]   (5.0, 13.0]     0.687814
... ... ... ... ... ... ...
91  (17.953, 90.0]  (4.0, 480.0]    (1.0, 5.0]          0.500905
92  (17.953, 90.0]  (4.0, 480.0]    (5.0, 13.0]         0.500905
93  (17.953, 90.0]  (4.0, 480.0]    (5.0, 13.0]         0.500905
94  (17.953, 90.0]  (4.0, 480.0]    (13.0, 1103.0]      0.500905
95  (17.953, 90.0]  (4.0, 480.0]    (13.0, 1103.0]      0.500905

和另一个名为df的DataFrame,类似于:

        a           b       c       
1       0.004213    11.0    11.0
2       32.326794   0.0     0.0 
3       5.415845    1.0     1.0 
4       0.001968    10.0    41.0    
5       0.014745    9.0     13.0    
... ... ... ... ... ...
1435435 0.000185    1.0     1.0 
1435436 89.999919   0.0     0.0 
1435437 4.788090    1.0     1.0 
1435438 7.441620    0.0     22.0    
1435439 0.001053    1.0     1.0

我希望将df的每一行与df_ref的所有行进行比较,确定它们属于哪一行,并从result中提取相应的df_ref值,然后将这些值放在包含1,435,439个元素的列表中(或仅在df中添加一个新列,都可以)。由于数据量很大,因此需要有效地进行编码,因此我知道简单的循环可能不是最佳方法,这就是为什么我寻求帮助。

2 个答案:

答案 0 :(得分:1)

我假设a的{​​{1}},bc列中的值的类型为intervalIndex,并且将它们结合起来总是独特的组合。如果是这种情况,那么我想解决方案可能只是为两个df设置索引并将它们组合为pe的问题

df_ref

将来我可能会花一些时间来创建虚拟数据帧,您可能希望共享一个片段以轻松地重新创建它们(根据我的回答),以便其他人更轻松地为您提供帮助。

让我知道这是否无济于事

答案 1 :(得分:0)

我会做类似以下的事情。制作名为df_ref的{​​{1}}的副本,将元组分成单独的列df_ref2a_low等。然后像这样加入框架

a_high

现在,您将df = df.join(df_ref2, on=( (df.a >= df_ref2.a_low) & (df.a <= df_ref2.a_high) & (df.b >= df_ref2.b_low) & (df.b <= df_ref2.b_high) & (df.c >= df_ref2.c_low) & (df.c <= df_ref2.c_high) ), how='inner') df = df.drop('a_low', 'a_high', 'b_low', 'b_high', 'c_low', 'c_high') 列加入了result。请注意,行数可能会增加,因为每个df行可以匹配多个df_ref行,因为您看到df_ref的前两行具有相同的间隔。

相关问题