合并两个数据帧,其中一个数据帧包含间隔数据

时间:2017-12-30 17:53:18

标签: python pandas dataframe

作为输入,我有两个数据帧:

data1 = [{'code':100}, {'code':120}, {'code':110}]
data1 = pd.DataFrame(data1)

   code
 0   100
 1   120
 2   110

data2 = [{'category':1, 'l_bound':99, 'r_bound':105},{'category':2, 'l_bound':107, 'r_bound':110},{'category':3, 'l_bound':117, 'r_bound':135}]
data2 = pd.DataFrame(data2)

   category  l_bound  r_bound
0         1       99      105
1         2      107      110
2         3      117      135

我想最终获得以下数据框,如果代码位于相应的区间中,则第一个数据框中的附加列作为类别编号:

    code   category
 0   100          1
 1   120          3
 2   110          2

间隔是随机的,原始数据帧非常大。循环使用itertuples太慢了。任何pythonic解决方案?

1 个答案:

答案 0 :(得分:1)

重新创建数据集:

import pandas as pd

data1 = [{'code':100}, {'code':120}, {'code':113}]
data2 = [{'category':1, 'l_bound':99, 'r_bound':105},
         {'category':2, 'l_bound':107, 'r_bound':110},
         {'category':3, 'l_bound':117, 'r_bound':135}]

data1 = pd.DataFrame(data1)
data2 = pd.DataFrame(data2)

@cᴏʟᴅsᴘᴇᴇᴅ回答(首选),请按照重复链接:

idx = pd.IntervalIndex.from_arrays(data2['l_bound'], data2['r_bound'], closed='both')
category = data2.loc[idx.get_indexer(data1.code), 'category']

data1['category'] = category.values

这是一种不同的方法。使用范围和类别中的值创建地图。

# Create a map
d = {i:k for k,v in data2.set_index('category').to_dict('i').items() 
     for i in range(v['l_bound'],v['r_bound']+1)}

# Use map to add new column
data1['category'] = data1.code.map(d)

最后

print(data1)

返回:

   code  category
0   100       1.0
1   120       3.0
2   113       NaN

如果你想要int,我们可以这样做:

data1.code.map(d).fillna(-1).astype(int) # -1 meaning no match

我们得到:

   code  category
0   100         1
1   120         3
2   113        -1