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解决方案?
重新创建数据集:
\n\nimport 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\nidx = 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\nprint(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如果你想要 int 我们可以这样做:
\n\ndata1.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
归档时间: |
|
查看次数: |
324 次 |
最近记录: |