如何按区间上界合并不同大小的两个Pandas DataFrame
问题描述
此前已解决基于区间下界合并不同大小Pandas DataFrame的问题,现需实现匹配对应区间的上界。
现有两个DataFrame:
import pandas as pd df1 = pd.DataFrame({'col1': [0.5, 0.75, 1.1, 1.6, 2, 3, 5.5, 10, 11.2] }) df2 = pd.DataFrame({'col2': [0, 3, 10, 15] })
匹配规则:df2['col2'].iloc[y] <= df1['col1'].iloc[x] < df2['col2'].iloc[y+1],需为df1的每个col1值匹配对应区间的上界(即df2['col2'].iloc[y+1]),期望结果:
df1['result'] = [3, 3, 3, 3, 3, 10, 10, 15, 15]
解决方案
方法1:使用numpy.searchsorted
利用searchsorted快速定位每个值在区间数组中的插入位置,直接映射到对应的上界:
import numpy as np # 提取df2的区间边界数组 bins = df2['col2'].values # 定位每个col1值的插入位置(遵循左闭右开规则) indices = np.searchsorted(bins, df1['col1'], side='left') # 映射到对应的区间上界 df1['result'] = bins[indices]
方法2:使用pd.cut
通过分箱函数直接将值映射到区间上界:
# 用df2的col2作为分箱边界,指定标签为区间上界,include_lowest确保第一个区间包含左边界 df1['result'] = pd.cut( df1['col1'], bins=df2['col2'].values, labels=df2['col2'].values[1:], include_lowest=True ) # 若需要将结果转为数值类型(pd.cut默认返回分类类型) df1['result'] = df1['result'].astype(int)
两种方法均可得到期望结果,其中numpy.searchsorted在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者AdR
相关产品推荐
相关产品推荐

