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

Ann*_*ina 6 python dataframe pandas

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

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
Run Code Online (Sandbox Code Playgroud)

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

    code   category
 0   100          1
 1   120          3
 2   110          2
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*vBR 3

重新创建数据集:

\n\n
import pandas as pd\n\ndata1 = [{'code':100}, {'code':120}, {'code':113}]\ndata2 = [{'category':1, 'l_bound':99, 'r_bound':105},\n         {'category':2, 'l_bound':107, 'r_bound':110},\n         {'category':3, 'l_bound':117, 'r_bound':135}]\n\ndata1 = pd.DataFrame(data1)\ndata2 = pd.DataFrame(data2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

@c\xe1\xb4\x8f\xca\x9f\xe1\xb4\x85s\xe1\xb4\x98\xe1\xb4\x87\xe1\xb4\x87\xe1\xb4\x85 答案(首选),请遵循重复链接:

\n\n
idx = pd.IntervalIndex.from_arrays(data2['l_bound'], data2['r_bound'], closed='both')\ncategory = data2.loc[idx.get_indexer(data1.code), 'category']\n\ndata1['category'] = category.values\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
# Create a map\nd = {i:k for k,v in data2.set_index('category').to_dict('i').items() \n     for i in range(v['l_bound'],v['r_bound']+1)}\n\n# Use map to add new column\ndata1['category'] = data1.code.map(d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后

\n\n
print(data1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回:

\n\n
   code  category\n0   100       1.0\n1   120       3.0\n2   113       NaN\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

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

\n\n
data1.code.map(d).fillna(-1).astype(int) # -1 meaning no match\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们得到:

\n\n
   code  category\n0   100         1\n1   120         3\n2   113        -1\n
Run Code Online (Sandbox Code Playgroud)\n