作为输入,我有两个数据帧:
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解决方案?
答案 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