1

我有一个 pandas DataFrame df_ref,它类似于:

    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

和另一个 DataFrame 称为df

        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并确定它们属于哪一行,然后从中提取相应的resultdf_ref并将这些值放入具有 1,435,439 个元素的列表中(或者只是 中的一个新列df,两者都有效)。由于数据很大,因此需要对其进行有效编码,因此我知道简单的循环可能不是最好的方法,这就是我寻求帮助的原因。

4

2 回答 2

1

我假设 columns 和 of 中的值的类型a是intervalIndex并且b它们组合起来你总是会得到一个唯一的组合。如果是这种情况,那么我想解决方案可能只是为两个 dfs 设置索引并将它们组合为 pecdf_ref

In [1]: import pandas as pd 
   ...:  
   ...: df_ref = pd.DataFrame({ 
   ...:     "a": pd.IntervalIndex.from_tuples([(-0.001, 0.00482), (-0.001, 0.00482), (-0.001, 0.00482), (-0.001, 0.00482), (1, 2)]), 
   ...:     "b": pd.IntervalIndex.from_tuples([(-0.001, 1.0), (-0.001, 1.0), (-0.001, 1.0), (1., 2.), (2, 3)]), 
   ...:     "c": pd.IntervalIndex.from_tuples([(-0.001, 1.0), (1.0, 2.0), (2.0, 5.0), (5.1, 10.0), (1, 2)]), 
   ...:     'result': [0.622745, 0.450869, 0.693840, 0.484881, 10] 
   ...: }) 
   ...:  
   ...: df = pd.DataFrame([{'a': 0.003, 'b': 0.004, 'c': 0.4}, {'a': 2., 'b': 3, 'c': 0.1}])                                                                            

In [2]: df_ref_idx = df_ref.set_index(['a', 'b', 'c'])                                                                                                                  

In [3]: df_idx = df.set_index(['a', 'b', 'c'])                                                                                                                          

In [4]: df_idx['result'] = df_ref_idx['result']                                                                                                                         

In [5]: df_idx                                                                                                                                                          
Out[5]: 
                   result
a     b     c            
0.003 0.004 0.4  0.622745
2.000 3.000 0.1       NaN

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

如果这没有帮助,请告诉我

于 2020-06-11T23:29:45.853 回答
0

我会做类似以下的事情。df_ref制作被调用的副本df_ref2,将元组拆分为单独的列a_lowa_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 行可以匹配多个 df_ref 行,因为您看到 df_ref 的前两行具有相同的间隔。

于 2020-06-11T23:41:51.873 回答